使用Java持久性查询语言(JPQL)转换SQL查询

时间:2013-05-08 19:15:57

标签: sql jpql

将此SQL查询转换为JPQL时遇到一些问题:

select max(datePurchase) from purchases where userId = id and date_trunc('day',datePurchase)
in (select distinct (date_trunc('day',datePurchase)) as day from purchases where userId = id and datePurchase < initialDate and datePurchase > finalDate) group by date_trunc('day',datePurchase)

这个sql运行良好,可以返回用户每天最后一次购买。我尝试在JPQL中做同样的事情:

Query query = em.createQuery("SELECT u MAX(u.datePurchase) FROM Purchases u WHERE u.userId.id = :id AND FUNC('day',u.datePurchase)" +
                "IN (SELECT DISTINCT (FUNC('day',u.datePurchase)) AS day FROM Purchases WHERE u.userId.id = :id AND u.datePurchase < :finalDate AND u.datePurchase > :inicialDate) GROUP BY FUNC('day',u.datePurchase)");

query.setParameter("id", idUsuario);
query.setParameter("dataInicial", dataInicial);
query.setParameter("dataFinal", dataFinal);
List<MovSaldo> saldos = (List<MovSaldo>) query.getResultList();

em.getTransaction().commit();

错误是: “IN表达式没有有效的表达式。” “必须为范围变量声明提供标识变量。”

可能不是一件非常困难的事情,但我已经花了一点时间来度过难关。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

虽然答案可能已经很晚了,但我仍然发布了它,因为它可能在将来帮助某人。

在嵌套选择中,您必须为您正在使用的实体添加标识符: FROM Purchases p 并更新(FUNC('day',u) .datePurchase))到(FUNC('day', p .datePurchase))

最佳!