2012-09-18 98 views
2

我有以下實體JPA 2個標準與@ElementCollection API和喜歡

class A { 
    @Id 
    Integer id; 

    String name; 

    @ElementCollection 
    @JoinTable(name = "othername", joinColumns = @JoinColumn(name = "id_a")) 
    @Column(name = "name") 
    List<String> othernames; 
} 

我試圖使用的標準API來找到使用的名字或其他名稱中綴搜索A的實例。基本上是這樣的SQL查詢:

SELECT * FROM A 
    WHERE name like '%something%' 
    OR id IN (SELECT id_a FROM othername WHERE name LIKE '%something%'); 

下面的代碼是爲了做正確的事:

String search = "%something%"; 
Subquery<Integer> subquery = c.subquery(Integer.class); 
Root<A> subqueryFrom = subquery.from(A.class); 
subquery.select(subqueryFrom.get(A_.id)); 
subquery.where(builder.like(subqueryFrom.get(A_.othernames), search)); 

query.where(builder.or(
    builder.like(from.get(A_.name), search), 
    from.get(A_.id).in(subquery) 
)); 

我使用子查詢在這裏,所以我沒有得到重複的結果(例如,某人搜索「a」,而某個對象的名稱包含「a」,其他名稱也包含「a」)。

下面這段代碼不起作用,因爲subqueryFrom.get(A.othernames)返回表達式<名單<字符串>>而builder.like只接受表達< String>終止。

我實際上認爲我的方法是完全錯誤的,但目前我想不出任何其他解決方案。

回答