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