java - JPA CriterialBuilder.concat 强制使用 concat 函数

标签 java hibernate jpa concatenation

我正在使用 CriteriaBuilder.concat 连接 2 个字符串,代码如下:

Expression<String> concat = criteriaBuilder.concat(expr1, expr2)

但是生成的 SQL 是这样的:

select distinct col_1 || col_2

导致org.hibernate.hql.ast.QuerySyntaxException:

expecting CLOSE, found '||' near line 1, column 48 [
select count(distinct generatedAlias0.hostname || generatedAlias0.device) from ...
                                                ^(1,48)

我想知道如何强制它生成以下使用 concat() 函数而不是 || 运算符的 SQL?

select distinct concat(col_1, col_2)

更新:

从错误中我们可以看出问题更多的是在Hibernate (v3.6.10.Final)这边,这就是为什么让MySQL接受||的原因串联没有帮助,更新到较新版本对我来说也不是一个选择。

谢谢

最佳答案

我实际上找到了解决方法。通过使用 @Formula (来自 Hibernate)而不是 CriteriaBuilder 来完成相同的任务,如下所示:

@Entity
public class MyEntity {

  @Column(name="col_a")
  private String colA;

  @Column(name="col_b")
  private String colB;

  @Formula("concat(col_a, col_b)")
  private String concated;

  //...
}

这样我就可以为 CriteriaBuilder.countDistinct 使用 concated 字段:

//...

Expression<?> exp = criteriaBuilder.countDistinct(entity.get("concated"));
criteriaQuery.select(exp);

TypedQuery<Long> query = entityManager.createQuery(criteriaQuery);
return query.getSingleResult();

我希望 JPA 能够(或者希望已经)支持具有多个列的 countDistinct,那么所有这些困惑都可以避免(参见:How to countDistinct on multiple columns,答案是NO).

关于java - JPA CriterialBuilder.concat 强制使用 concat 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25469858/

相关文章:

java - 在Java中,new TestA()和TestA obj = new TestA()有什么区别?

java - JPA 以及与持久性提供程序和数据库供应商的兼容性

java - 如何在切换后启动 JPanel

mysql - Spring + Hibernate - @Table 名称注释的问题

java - 使用 hibernate 时返回的小写列名

java - 如何使用 JPA 解决 javax.persistence.EntityNotFoundException(不是使用 @NotFound)

java - 使用 @Configuration 注释 WebSecurityConfigurerAdapter 会导致配置被调用两次

java - Spring Hibernate 的数据库每用户连接

java - SpringBoot JPA data.sql失败

java - 如何使用mysql查询找到更接近另一个日期的日期