Hibernate,使用Predicates按ManyToMany上的子查询计数排序

时间:2016-09-30 09:37:17

标签: spring postgresql hibernate jpa

我在Hibernate中使用Predicates编写了一个查询,我需要在连接表上添加一个子查询来计算连接数和顺序,以及它们在一组id中存在的连接数。

连接表是ManyToMany关系。

我正在使用flyway来设置表模式,所以当数据库中存在连接表时,Hibernate中不需要连接模型来连接2个相关模型,因此不存在连接模型。

我不关心检索这些相关的模型,我只想要连接的数量,以便我可以通过它们订购。

以下是PostGreSQL,它有效。我需要将以下PSQL转换为基于谓词的查询:

SELECT u.*, COUNT(jui.interest_id) AS juiCount
FROM "user" u
LEFT JOIN (
    SELECT ui.user_id, ui.interest_id
    FROM user_interest ui
    WHERE ui.interest_id IN (?)
) AS jui ON u.id = jui.user_id
GROUP BY u.id
ORDER BY juiCount DESC

将为IN条件提供的id传递到子查询中。上面的查询是在PostGreSQL中。

使用到目前为止的工作:

    CriteriaBuilder b = em.getCriteriaBuilder();
    CriteriaQuery<User> q = b.createQuery(User.class);
    Root<User> u = q.from(User.class);

    // This doesn't make sense because this is not a join table
    // Subquery<Interest> sq = q.subquery(Interest.class)
    // Root<Interest> squi = sq.from(Interest.class);
    // sq.select(squi);
    // sq.where(b.in("interest_id", new LiteralExpression<Long[]>((CriteriaBuilderImpl) b, interestIds)));

    q.orderBy(
    //    b.desc(b.tuple(u, b.count(squi))),
        b.asc(u.get(User_.id))
    );

    q.where(p);

    return em
        .createQuery(q)
        .getResultList();

我设法找到的所有内容似乎都不合适,因为他们在他们的示例中没有使用ManyToMany来使用q.subquery()。

任何人都可以帮忙填写空白吗?

0 个答案:

没有答案