JPA CriterialBuilder.concat强制使用concat函数

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

 Expression 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字段:

 //... Expression exp = criteriaBuilder.countDistinct(entity.get("concated")); criteriaQuery.select(exp); TypedQuery query = entityManager.createQuery(criteriaQuery); return query.getSingleResult(); 

我希望JPA(或者希望已经)支持countDistinct有多个列,然后可以避免所有这些混乱(请参阅: 如何对多列进行countDistinct ,答案为 )。

我在concat函数中遇到了类似的问题。 我在selectCase中使用了concat函数,这也返回了相同的QuerySyntaxException。

我的解决方法是通过条件构建器函数使用concat函数:

 cb().selectCase().when(cb().equal(root.get(Person_.flag), cb().literal("1")), cb().function("CONCAT", String.class, root.get(Person_.something), cb().literal(" bla bla bla"))) .otherwise(root.get(Person_.something))) 

Hibernate版本4.3.11.Final