play framework 2.2: как определить запрос ManyToMany ebean

Я пытаюсь реализовать учебник по ябэ из игры 1.0 в игре 2.0.

В настоящее время я застрял в функциональности тегов: http://www.playframework.com/documentation/1.2.3/guide6

По сути проблема вот в чем:

У меня есть класс Post, каждый объект Post может иметь несколько тегов, связанных с этим классом:

@ManyToMany(cascade=CascadeType.PERSIST)
public Set<Tag> tags;

Я хочу написать функцию, которая, учитывая массив тегов, будет возвращать список сообщений, если и только если все теги присутствуют в объектах Post.

Юнит-тесты следующие:

    @Test
public void testTags() {
    // Create a new user and save it
    SuperUser.setInstance("[email protected]", "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();
}

Я понятия не имею, что делать дальше, так как я грубо форсирую это и ничего не получаю :(

Спасибо!


person Marc HPunkt    schedule 12.10.2013    source источник
comment
Что не так с вашим решением?   -  person Leo    schedule 14.10.2013
comment
Список, возвращаемый функцией, пуст.   -  person Marc HPunkt    schedule 14.10.2013


Ответы (2)


Попробуйте включить ведение журнала EBean SQL. Очень полезно посмотреть, какие операторы SQL выполняет EBean.

См. этот вопрос Stackoverflow

person IanRae    schedule 16.10.2013

Вы действительно близки. Проблема в ваших отношениях. То, что вы хотите в своем классе Post, это:

@OneToMany(cascade=CascadeType.PERSIST, mappedBy = "post")
public Set<Tag> tags;

а затем в своем классе Tag добавьте следующее:

@ManyToOne()
public Post post;

В зависимости от того, насколько ваша схема БД соответствует вашему классу модели, вам может потребоваться или не потребоваться экспериментировать с добавлением аннотаций @JoinColumn.

Это показывает Эбину предполагаемые отношения. One (Post) to Many (Tags) в модели сообщений, Many (Tags) to One (Post) в модели тегов.

person sean.boyer    schedule 12.03.2014