Select JPQL选择元素集合

Select JPQL选择元素集合,select,jpql,java-ee-7,Select,Jpql,Java Ee 7,我有一个具有此属性的实体帖子: @ElementCollection @CollectionTable(name ="tags") private List<String> tags = new ArrayList<>(); 然后我有一个带有GROUPBY的本机select查询。现在的问题是如何选择属性标记 我的选择查询: Query query = em.createQuery("SELECT p.id,MAX(p.createdAt),MAX(p.value) FR

我有一个具有此属性的实体帖子:

@ElementCollection
@CollectionTable(name ="tags")
private List<String> tags = new ArrayList<>();
然后我有一个带有GROUPBY的本机select查询。现在的问题是如何选择属性标记

我的选择查询:

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;

如何选择属性标记?

不知道这是否有帮助,但在JPA2.1规范第4.4.6部分集合成员声明中,您可以这样做:

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

注意:我将t添加到GROUP BY,因为如果不使用聚合函数,它将无法处理查询。

谢谢,但现在由于GROUP BY t,我为每个标记获得了相同的实体。我想选择t作为列表。这可能吗?事实上,在重新阅读您的查询之后,我不明白为什么您在按p.id分组时对p.createDate,p.value执行最大值,而p.id可能是主键=>删除分组,并使用惰性或急切加载,例如:对于Post Post:results Post.getTags;我刚刚解决了这个问题,因为我现在只选择了p而不是它的所有属性。