gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:06:46 55 4
gpt4 key购买 nike

我正在使用 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/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com