gpt4 book ai didi

hibernate - Hibernate @Formula中TRIM函数的参数数量错误

转载 作者:行者123 更新时间:2023-12-04 20:10:59 29 4
gpt4 key购买 nike

我正在尝试制定一个公式来选择用户个人资料的用户友好名称。它选择名字 + ' ' + 姓氏 如果其中至少有一个不为空且不为空(包含非空白字符),否则选择 短名称 (条件相同),最后,如果 短名称 为空或 null,它选择 编号 , 转换为字符串。

@Formula("COALESCE(NULLIF(TRIM(BOTH FROM CONCAT(sp.firstname, ' ', sp.lastname)), ''), TRIM(p.shortname), to_char(p.id, 'FM9999999999999999')) " +
"FROM socialprofile AS sp " +
"JOIN profile AS p ON sp.id=p.id")
public String getUserFriendlyName() {
return super.getUserFriendlyName();
}

结果是:
org.hibernate.HibernateException: Unexpected number of trim function operands : 10

但只有 3 个参数:BOTH、FROM 和 CONCAT 的结果。这个问题有什么解决方法吗? DB 是 PostgreSQL 9.1,Hibernate 版本是 4.2.1。
以防万一,这是表结构:
Profile
bigint id
text shortname

SocialProfile
bigint id
text firstname
text lastname

它们通过 一对一关联。编号 字段,在 Java 代码中 SocialProfile 扩展 Profile。在 PgAdmin SQL 编辑器中,此请求完美运行。

最佳答案

我也遇到了这个问题。看来 @Formula代表Hibernate's internal "where template" parser不期望嵌套在 trim() 中的另一个函数.此问题报告为 HHH-5970之前,但他们没有做任何事情。

解决方法很简单:不要使用 trim()这样在 @Formula .而是使用例如ltrim(rtrim(..))甚至是替换 "^\s+|\s+$" 的特定于数据库的正则表达式函数通过 "" ,取决于正在使用的数据库的功能。

PostgreSQL 支持 ltrim()rtrim() ,所以这应该为你做:

@Formula("COALESCE(NULLIF(LTRIM(RTRIM(BOTH FROM CONCAT(sp.firstname, ' ', sp.lastname))), '') [...]"

关于hibernate - Hibernate @Formula中TRIM函数的参数数量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17296037/

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