gpt4 book ai didi

java - 标准 API - 分组依据 - 未生成

转载 作者:行者123 更新时间:2023-12-01 05:47:53 26 4
gpt4 key购买 nike

我正在为一些很可能非常简单的事情而烦恼,但我就是做不到。

我的 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 子句。

作为一个令人讨厌的快速修复,我正在运行通过函数返回的列表来删除重复项,直到找到解决方案。

预先感谢您的帮助,

大卫

最佳答案

为了清楚起见,将其重写为常规 JPQL 查询,目前您拥有如下内容:

SELECT o
FROM Orders o JOIN o.productsCollection p
WHERE ...
GROUP BY o.pkOrdID...

这里有两个问题。首先,分组依据不正确,因为当选择完整对象时,您无法对单个列进行分组 - 就像标准 SQL 一样,所有选定的非聚合列必须在分组依据中列出。第二个问题是你根本不需要在这里进行分组。请参阅下文了解您的选项:

由于您在这里没有使用任何聚合函数,因此您真正想要的只是:

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 link 在这里只是忽略你的组而不是报告错误。您使用的是哪个版本?

关于java - 标准 API - 分组依据 - 未生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5491158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com