2011-08-28 122 views
1

我有一個查詢,我一直試圖變成CriteraQuery,但我沒有得到如何編碼查詢的「IN」項。需要幫助編碼CriteriaQuery「in」謂詞

JPA查詢的作品看起來是這樣的:

@NamedQuery(name = "User.fromSearchID", 
    query = "SELECT q FROM User q," 
    + " IN (q.data) AS s WHERE s.data LIKE :search" 
    + " ORDER BY q.id") 

而且它的工作原理上看起來是這樣的實體:

@Entity 
public class User { 

    @Id private Integer id; 

    @OneToMany private List<UserData> data; 

    ... } 

而且引用的實體是

@Entity 
public class UserData { 

    @Id private Long id; 

    private String key; 

    private String data; 

    ... } 

預期結果(NamedQuery的作用)是提取出在數據列表中有一些匹配的所有用戶實體屬性。出於某種原因,CriteraQuery語法轉義我的直覺。任何幫助?

回答

1

我假設用戶應該是唯一的? 然後JP QL版本,而比較舊的時尚是:通過標準API

String searchArgument = "data1"; 
String query = " SELECT DISTINCT(u) " + 
       " FROM User u JOIN u.data ud " + 
       " WHERE ud.data LIKE :search ORDER BY u.id"; 
List<User> result =em.createQuery(query, User.class). 
       setParameter("search", searchArgument).getResultList(); 

而且相同:

String searchArgument = "data1"; 
CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<User> cq = cb.createQuery(User.class); 
Root<User> user = cq.from(User.class); 

Predicate dataLike = cb.like(user.join("data").<String>get("data"), 
          cb.parameter(String.class, "search")); 
cq.distinct(true).select(user) 
    .where(dataLike) 
    .orderBy(cb.asc(user.get("id"))); 

TypedQuery<User> findUniqueUserByUserDataData = em.createQuery(cq); 
findUniqueUserByUserDataData.setParameter("search", searchArgument); 
+0

這是一個很好的答案,所以我將其標記。最後我使用了一個Map集合和一個MapJoin來做到這一點,所以不需要明確的子語句。 – AlanObject