当前位置: 首页 > 知识库问答 >
问题:

API中计算列名的ORDER BY准则(按别名)

公冶高义
2023-03-14

有一种情况,我的java代码是象征性的查询-

  SELECT CUSTOMER_ID,
         CUSTOMER_NAME,
         CASE
             WHEN COUNT (DISTINCT CARD_ID) > 1 THEN 'MULTIPLE'
             ELSE MAX(CARD_NUM)
         END    AS CARD_NUM
    FROM CUSTOMER LEFT JOIN CARD ON CARD.CUSTOMER_ID = CUSTOMER.CUSTOMER_ID
GROUP BY CUSTOMER_ID, CUSTOMER_NAME

Java详细信息的代码-

CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Tuple> query = cb.createQuery(Tuple.class);
final Root<Customer> root = query.from(Customer.class);
Expression<Object> caseSelect = cb.selectCase()
        .when(cb.greaterThan(cb.countDistinct(join.get(Card_.cardId)), 1L), "MULTIPLE")
        .otherwise(cb.greatest(Card_.get(Card_.cardNum)));
caseSelect.alias("card_num");
selects.add(caseSelect);
query.multiselect(selects).distinct(true);
query.groupBy(exprs);
query.orderBy(cb.asc(caseSelect));

现在,如何在API中按标准进行排序。

  1. 如果我按根排序。CARD_NUM,该属性在根目录中不存在。-抛出异常
  2. 如果我按caseSelect表达式本身排序,它会抛出一个错误,说明CARD_ID不在查询的选定部分中
  3. 我不能在select表达式中使用card_num/card_id,这不适合查询

有没有办法直接用别名订购?我知道顺序是表达式类型,以及如何从字符串名中获取表达式。我想你可以在冬眠时这样做。是否可以在criteria API中使用hibernate orderby?猜一个愚蠢的问题

感谢您的帮助。

共有3个答案

靳金鹏
2023-03-14

JPA Criteria API似乎不可能做到这一点,您将不得不回退到使用JPQL/HQL。

储法
2023-03-14

使用标准应用编程接口,您需要按caseSelect表达式排序。我试了一下,它在HiberNate 5.4中运行良好。您使用哪个版本?

劳灵均
2023-03-14

我也面临着类似的情况。。。

query.multiselect(root, computedColumn);
query.orderBy(new Order[]{filterDTO.getSortAsc() ? cb.asc(cb.literal(2)) : cb.desc(cb.literal(2))});

我的案例计算列是子查询。。。我没有设法通过列别名使其工作,但它似乎通过tuple中返回的列索引工作,所以我猜在您的代码中,它应该通过索引1工作

query.orderBy(cb.asc(cb.literal(1)));
 类似资料:
  • 问题内容: 我使用别名来引用计算列。这是我尝试制作的实际代码的一部分,用于计算相似度并返回相似度得分为3或更高的匹配项。 异常消息: 无效的列名“相似性”。 由于相似性不是真正的专栏文章,我将如何进行这项工作? 问题答案: 在查询的投影()阶段执行列别名和计算,该阶段在选择(和)阶段之后发生。因此,无法在子句或条件中引用它们,因为它们尚不存在。您可以将带有子句的查询用作子查询,也可以在子句中重复计

  • 问题内容: 计算在查询中声明的两个临时列名称的sum()-在SQL中 表只有两列。将total和total1作为临时名称给出。 如何计算作为与列名声明为临时名称为查询执行。 使用cte不支持重复的列名吗? 如何利用它来支持重复的列名 问题答案: 您不能直接做到这一点-您需要使用CTE(公用表表达式)之类的东西-像这样: 它在SQL Server 2005和更高版本(以及支持CTE(这是ANSI标准

  • 问题内容: 我想按列别名对sql语句进行分组。实质上,我希望以下内容在逻辑上能够正常运行,但不允许按使用as创建的列进行分组。(无效的列名)。有人提示吗? 问题答案: 对于立即出现的分组问题,您需要使用相同的表达式对新列进行分组或对新列进行计算,或者从派生表中使用它。 另一方面,如果不需要,则不应使用。

  • 尝试编写一个标准api查询。 应该作为参数传递,并且可以更改。我在代码中添加了实体。 感谢任何帮助或指导。 这就是我目前的情况: 我现在能够获取正确的数据,但列表没有排序。这是我在日志中看到的,生成了两个查询,一个有顺序,另一个没有顺序。

  • 问题内容: 为什么此查询不起作用? 在此示例中,我尝试在其他计算中使用my_num别名。这导致未知列“ my_num” 这是我正在尝试做的简化版本,但是基本上我想使用别名进行其他计算。我的计算要复杂得多,这就是为什么给它加上别名的原因,因为我以不同的方式重复了几次。 问题答案: 只需将您的重用别名包装为:

  • 示例数据: 我想计算每个唯一列名称的平均值和标准偏差(忽略NA)以获得如下输出: 可再现数据: 我得到的最接近的是 这是我从这篇文章中得到的,但我不知道如何调整它来得到我想要的。我知道我可以取rowmeans的平均值来得到每组的平均值,但这不适用于标准差。