2011-08-28 71 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