我正在把头发撕成一些非常简单的东西, 但我无法做对。
我的GroupBy子句未添加到EclipseLink生成的SQL中。
尝试过以下代码的许多不同订单和变体。
public List<Orders> findOrdersEntitiesBySearch(int maxResults, int firstResult, String column1, String column2, String key, boolean searchOrder) {
EntityManager em = getEntityManager();
try {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Orders> cq = cb.createQuery(Orders.class);
Root<Orders> order = cq.from(Orders.class);
Join<Orders, Products> prod = order.join("productsCollection");
// Where like key
if (column1 != null && column2 != null) {
if (searchOrder) {
cq.where(cb.or(cb.like(cb.lower(order.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"), cb.like(cb.lower(order.get(column2).as(String.class)), "%" + key.toLowerCase() + "%")));
} else {
cq.where(cb.or(cb.like(cb.lower(prod.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"), cb.like(cb.lower(prod.get(column2).as(String.class)), "%" + key.toLowerCase() + "%")));
}
} else {
if (searchOrder) {
cq.where(cb.like(cb.lower(order.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"));
} else {
cq.where(cb.like(cb.lower(prod.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"));
}
}
// Order By
List<Order> orderByList = new ArrayList<Order>();
orderByList.add(cb.desc(order.get("ordDate")));
orderByList.add(cb.desc(order.get("pkOrdID")));
cq.orderBy(orderByList);
// Select
cq.select(order);
// Group by
//cq.groupBy(order.get("pkOrdID"));
//Expression<Integer> grouping = order.get("pkOrdID").as(Integer.class);
Expression<String> grouping = order.get("pkOrdID").as(String.class);
cq.groupBy(grouping);
Query q = em.createQuery(cq);
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
return q.getResultList();
} finally {
em.close();
}
}
代码编译运行正常,我得到结果,但我的GroupBy子句不包括在内。
作为一个令人讨厌的quickfix,我正在运行通过函数返回的列表来删除重复项,直到我找到解决方案。
提前感谢您的任何帮助,
大卫
答案 0 :(得分:0)
为清楚起见,重写为常规JPQL查询,您目前有类似这样的内容:
SELECT o
FROM Orders o JOIN o.productsCollection p
WHERE ...
GROUP BY o.pkOrdID...
这里有两个问题。首先,group by不正确,因为当选择完整对象时,您无法在单个列上进行分组 - 就像使用标准SQL一样,所有不是聚合的选定列必须在group by中列出。第二个问题是你根本不需要分组。请参阅下面的选项:
由于您未在此处使用任何聚合函数,因此您实际需要的只是:
SELECT DISTINCT o
FROM Orders o JOIN o.productsCollection p
WHERE ...
因此,只需从条件API查询中删除分组,然后改用cq.distinct(true)
。
如果您真的需要使用聚合函数进行分组,而不是对所选对象的主键进行分组,则在JPA中按对象本身进行分组。一个简单的JPQL示例可能是:
SELECT o, sum(p.quantity)
FROM Orders o JOIN o.productsCollection p
WHERE ...
GROUP BY o
在您的查询中,这将是cq.groupBy(order)
。
顺便说一下。我不知道为什么eclipse链接会在这里忽略你的组,而不是报告错误。你使用的是哪个版本?