我正在尝试从play 2.0中的play 1.0实现yabe教程
目前,我仍然坚持使用标记功能:http://www.playframework.com/documentation/1.2.3/guide6
基本上问题是:
我有一个Post类,每个Post对象可以有多个与该类关联的标签:
@ManyToMany(cascade=CascadeType.PERSIST)
public Set<Tag> tags;
我想编写一个函数,当给定一个标签数组时,它将返回一个Posts列表,当且仅当Post对象中存在所有标签时。
单元测试如下:
@Test
public void testTags() {
// Create a new user and save it
SuperUser.setInstance("bob@gmail.com", "secret", "Bob").save();
SuperUser bob = SuperUser.getInstance();
// Create a new post
Post bobPost = new Post(bob, "Hello world","My first post");
bobPost.save();
Post anotherBobPost = new Post(bob, "Hello world", "Hop");
anotherBobPost.save();
// Well
assertEquals(0, Post.findTaggedWith("Red").size());
// Tag it now
bobPost.tagItWith("Red").tagItWith("Blue").save();
anotherBobPost.tagItWith("Red").tagItWith("Green").save();
// Check
assertEquals(2, Post.findTaggedWith("Red").size());
assertEquals(1, Post.findTaggedWith("Blue").size());
assertEquals(1, Post.findTaggedWith("Green").size());
// Checks for multiple tag params
assertEquals(1, Post.findTaggedWith("Red", "Blue").size()); //Fail - Actual: 0
assertEquals(1, Post.findTaggedWith("Red", "Green").size());
assertEquals(0, Post.findTaggedWith("Red", "Green", "Blue").size());
assertEquals(0, Post.findTaggedWith("Green", "Blue").size());
SuperUser.removeSuperUser();
}
我目前的实施如下:
public static List<Post> findTaggedWith(String... tags) {
ExpressionList<Post> expAcc = Post.find.fetch("tags").where().conjunction();
for( String tag : tags){
expAcc = expAcc.eq("tags.name", tag);
}
return expAcc.endJunction().findList();
}
我不知道接下来要做什么,因为我粗暴地强迫这样做,无处可去:(
谢谢!
答案 0 :(得分:1)
尝试转换EBean SQL日志记录。查看EBean正在执行的SQL语句非常有用。
答案 1 :(得分:0)
你真的很亲密。问题出在你的关系中。您在Post
课程中想要的是:
@OneToMany(cascade=CascadeType.PERSIST, mappedBy = "post")
public Set<Tag> tags;
然后在您的Tag
课程中添加以下内容:
@ManyToOne()
public Post post;
根据您的数据库架构与您的Model类的匹配程度,您可能也可能不必尝试添加@JoinColumn
注释。
这显示了Ebean的预期关系。后期模型中的One (Post) to Many (Tags)
,标记模型中的Many (Tags) to One (Post)
。