1、 public int compareTo(Tag otherTag) return pareTo(otherTag.name);由于我们打算用findOrCreateByName(String name)工厂方法来实现懒散式特征创建或得到这些特征。那么,让我们把它添加到Tag类里:public static Tag findOrCreateByName(String name) Tag tag = Tag.find(byName, name).first(); if(tag = null) tag = new Tag(name); return tag;Tagging posts是时候创建T
2、ag模型与Post模型的关系了,让我们在Post类里创建正确的关系:ManyToMany(cascade=CascadeType.PERSIST)public Set tags;public Post(User author, String title, String content) ments = new ArrayList(); this.tags = new TreeSet this.author = author; this.title = title; this.content = content; this.postedAt = new Date();请注意,在这里我们使用了Tr
3、eeSet以可预知的顺序来保存特征列表 (事实上是按字母顺序的,这是基于我们之前compareTo实现)。在这里,我们仅使用单向关系。同时,我们将添加很多帮助方法来使特征管理简单化,第一个用于tag一个Post:public Post tagItWith(String name) tags.add(Tag.findOrCreateByName(name); return this;下一个用于通过指定的tag找回所有的博文:public static List findTaggedWith(String tag) return Post.find( select distinct p from
4、Post p join p.tags as t where t.name = ?, tag ).fetch();是时候测试这些新代码了,让我们重新启动服务器到测试模式:$ play test在basicTest类里添加Test:Testpublic void testTags() / Create a new user and save it User bob = new User(bob, secretBob).save(); / Create a new post Post bobPost = new Post(bob, My first postHello world Post anot
5、herBobPost = new Post(bob, Hop / Well assertEquals(0, Post.findTaggedWith(Red).size(); / Tag it now bobPost.tagItWith().tagItWith(Blue anotherBobPost.tagItWith(Green / Check assertEquals(2, Post.findTaggedWith( assertEquals(1, Post.findTaggedWith(检查其是否正常工作。下面的内容比上面的要难一点好了,如果打算用多个tag来找回博文又该怎么做?看起来,这样
6、难一点!下面我将给你一些非常有用的JPQL查询,这些查询可能对你的web项目有用: findTaggedWith(String. tags) select distinct p from Post p join p.tags as t where t.name in (:tags) group by p.id, p.author, p.title, p.content,p.postedAt having count(t.id) = :size ).bind(tags, tags).bind(, tags.length).fetch();最棘手的部分就是我们必须使用having count语句来
7、对联合查询视图进行过滤,仅让完全拥有全部tag的博文通过。请注意,在这里我们不能使用Post.find(, tags, tags.count)签名进行查询。这是因为tags已经是变量参数(vararg)了。测试程序如下:assertEquals(1, Post.findTaggedWith(assertEquals(0, Post.findTaggedWith(特征(tag)云哪里有tags,哪里就需要一个tag云。让我们在Tag类里添加一个方法来生成tag云:Map getCloud() List result = Tag.find(select new map(t.name as tag,
8、 count(p.id) as pound) from Post p join p.tags as t group by t.name order by t.name return result;在这里,我们使用了hibernate的一个现成特性,这个特性允许我们从一个JPA查询里返回一个定制对象。这个在List里的结果包含了一个Map,Map中的每个tag都带有两个key:tag用作tag名称,pound用作tag统计结果。测试代码为:List A Play注意:一定要把这些Tags数据描述添加到YAML文件头部,这是因为这些数据需要在任何Post引用它们时进行创建。现在重新启动应用程序,强
9、制加载这些新的数据集。请注意,play甚至会告诉你在YAML文件里存在的问题:然后修改#display /标签来显示这些tag集(在full博文视图下)。修改/yabe/app/views/tags/display.html文件:#if _as != full |& $_ments.size() ?: no comment$_ments.size().pluralize() #if _ments , latest by $_ments0.author #/if/span#/if#elseif _post.tagspost-tags - Tagged #list items:_post.tags, as:taga href=#$tag$tag_isLast ? :, #/list#/elseif创建特征相关(tagged with)页面现在,我们就可以通过tags(特征)来列出发表的博文。在上面的#display / 标签里,我们把链接暂时留为空链接(用#),下面我们将通过一个链接到新创建的listTagged action替换他们:- Tagged#list items:Application.listTagged(tag.name)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1