如何在使用jpa条件查询的case语句中使用concat函数

Posted

技术标签:

【中文标题】如何在使用jpa条件查询的case语句中使用concat函数【英文标题】:how to use concat function in case statement using jpa criteria query 【发布时间】:2016-11-25 10:54:53 【问题描述】:

当条件满足时,我在case语句中连接字符串和表达式,如下所述。

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Object[]> cq = builder.createQuery(Object[].class);
Root<StudentRegistration> root = cq.from(StudentRegistration.class);
Expression<Object> str = builder.selectCase().when(builder.greaterThanOrEqualTo(root.get(StudentRegistration_.studentRegistrationGrade), 3),builder.concat("CDATA",root.get(StudentRegistration_.studentRegistrationGrade))).otherwise("-1");
cq.select(str);
em.createQuery(cq).getResultList();

因为在 case 语句中编写了 concat 函数,所以我遇到了异常。我通过提供 builder.literal() 尝试了所有可能的方法,但我无法解决这个问题。两天以来,我一直在解决这个问题。请帮帮我。

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: || near line 1, column 314 [select case when generatedAlias0.studentRegistrationGrade >=3  then :param0 || generatedAlias0.studentRegistrationGrade else :param1 end from StudentRegistration as generatedAlias0]
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)

提前致谢

【问题讨论】:

【参考方案1】:

您是否为您的数据库设置了正确的方言?

【讨论】:

我认为,生成的 SQL 缺少括号。在此处发布您的配置文件。您使用的是最新版本的 JPA 提供程序吗? (:param0 || 生成Alias0.studentRegistrationGrade)

以上是关于如何在使用jpa条件查询的case语句中使用concat函数的主要内容,如果未能解决你的问题,请参考以下文章

JPA:在 where 子句和 Case 语句中一起使用列表 - 有没有办法循环?

带有 CASE 条件和 SUM() 的 SELECT 查询

SQL里if语句和case语句有啥区别吗?哪个使用更高效?就是查询更优化?

case when用法sql

如何使用 SQL 中的 Case 语句将数据插入临时表

存储过程中如何使用Case嵌套