JPQL SELECT ElementCollection

时间:2014-07-20 19:17:37

标签: select jpql java-ee-7

我有一个实体" Post"有这个属性:

@ElementCollection
@CollectionTable(name ="tags")
private List<String> tags = new ArrayList<>();

然后我有一个带有group by的本机选择查询。现在的问题是如何选择属性标签?

我的选择查询:

Query query = em.createQuery("SELECT p.id,MAX(p.createdAt),MAX(p.value) FROM Post p JOIN p.tags t WHERE t IN (?1,?2,?3) GROUP BY p.id ORDER BY COUNT(p) DESC");
    /* ...

    query.setFirstResult(startIndex);
    query.setMaxResults(maxResults);
    List<Object[]> results = query.getResultList();

    List<Post> posts = new ArrayList<>();
    for (Object[] result : results) {
        Post newPost = new Post();
        newPost.setId(((Number) result[0]).longValue());
        newPost.setCreatedAt((Date) result[1]);
        newPost.setValue((String) result[2]);
        posts.add(newPost);
    }
    return posts;

如何选择属性标签?

1 个答案:

答案 0 :(得分:2)

不知道它是否会有所帮助,但在JPA2.1 Spec,part 4.4.6 Collection Member Declarations 中,您可以这样做:

SELECT DISTINCT o
FROM Order o, IN(o.lineItems) l
WHERE l.product.productType = ‘office_supplies’

所以我猜你的情况可以尝试:

SELECT p.id,MAX(p.createdAt),MAX(p.value), t
FROM Post p, IN(p.tags) t 
WHERE t IN (?1,?2,?3) 
GROUP BY p.id, t
ORDER BY COUNT(p) DESC

注意:我在GROUP BY添加了t,因为如果不使用聚合函数,它将不适用于查询。