2014-01-18 106 views
4

我在Play 2 Framework中使用Ebean,並獲得了兩種模型:用戶模型和書籍模型。用戶模型以OneToMany關係與書籍模型連接。所以每個用戶都可以有很多書或者根本沒有書。書籍模型本身也具有屬性。現在,我想在用戶模型中創建一個查詢,該查詢僅返回擁有特定屬性書籍的用戶。例如:一個屬性可能是條件,如新或使用。現在給我所有擁有新書籍的用戶。 是否可以使用Ebean方法創建這樣的查詢?或者我必須使用原始SQL?OneToMany Relationship的Ebean查詢

回答

9

假設你有以下型號:

@Entity 
public class User extends Model { 
    @Id 
    @Column(name = "user_index") 
    private int id; 

    @Column(name = "user_first_name") 
    private String firstName; 

    [...] 

    @OneToMany(mappedBy = "book_owner_index") 
    private List<Book> books; 

    public static Finder<Integer, User> find = new Finder<Integer, User>(Integer.class, User.class); 

    [...] 
} 

@Entity 
public class Book extends Model { 
    @Id 
    @Column(name = "book_index") 
    private int id; 

    @Column(name = "book_name") 
    private String name; 

    @Column(name = "book_condition") 
    private String condition; 

    [...] 

    @ManyToOne 
    @JoinColumn(name = "book_owner_index", referencedColumnName = "user_index") 
    private User owner; 

    [...] 
} 

然後,你可以做一個搜索:

List<User> users = User.find.select("*") 
          .fetch("books") 
          .where() 
          .eq("books.condition", "new") 
          .findList(); 
+0

非常感謝!完美的作品。一個後續問題:用戶擁有的書籍數量是否可以輕鬆訂購? – linsenfips

+0

我相信你可以用公式註釋做到這一點。就像用'@Formula(select =「(SELECT COUNT(*)FROM books WHERE book_owner_index = $ {ta} .index)」)'給你的'User'模型添加一個int字段,然後你可以按該字段排序。但這是未經測試的代碼。有關更多詳細信息,請參閱[這裏](http://www.avaje.org/static/javadoc/pub/com/avaje/ebean/annotation/Formula.html)。 – t0mppa

+0

完全如你所說。公式註釋可以做到這一點。再次感謝! – linsenfips

0
List<User> users = User.find.select("*") 
         .fetch("books") 
         .where() 
         .eq("t1.condition", "new") 
         .findList(); 

對於我來說,它只能當我使用「t1。」時,我正在使用Postgres DB。生成的查詢對於t1有意義。