查询后如何设置@Transient 字段值?使用 Hibernate Criteria 进行查询
Posted
技术标签:
【中文标题】查询后如何设置@Transient 字段值?使用 Hibernate Criteria 进行查询【英文标题】:How can I set a @Transient field value after query? Using Hibernate Criteria for query 【发布时间】:2016-03-14 10:17:33 【问题描述】:让我详细描述问题以避免 X-Y 情况。
我想使用 Hibernate 执行LIKE
查询以检索表Product
中的注册表,其中Product
的User
将我的输入字符串作为全名。 SQL中的一些东西:
SELECT * FROM product WHERE id_user IN (SELECT id_user FROM users WHERE CONCAT(first_name, ' ', last_name) LIKE ?)
我对 Hibernate Criteria 很满意,但在这种情况下,它似乎无法在 Criteria 中组合列值搜索(我不想生成一些自定义的 Criteria),所以我尝试使用 @987654326 @,但我发现在某些情况下createAlia()
很容易而sqlRestriction
是不可能的,例如:
criteria.createAlias("user.supervisor.teamleader", "uT");
所以,我正在考虑另一种解决方案:在User
中创建一个@Transient
字段来存储全名,连接first_name
、" "
和last_name
,因为现在名为full_name
的列没有'在数据库中不存在,我不想碰表结构,这需要修改生产数据库。
如果我在User
类的默认构造函数中声明full_name
字段,当我从数据库中检索一些User
实体时,该字段会像我预期的那样包含first_name + " " + last_name
,还是null
?
【问题讨论】:
【参考方案1】:如果我在 User 类的默认构造函数中声明 full_name 字段,当我从数据库中检索一些 User 实体时,该字段是否会像我预期的那样包含 first_name + " " + last_name,还是为 null?
它将保存字符串"null null"
,因为在填充字段之前调用了默认构造函数。
实体是一个简单的 Java 类。因此,如果您执行new Persist()
或Class<Persist>.newInstance()
,则始终首先调用默认构造函数。第二种方式是 Hibernate 如何创建持久类的对象。
这种方法不会解决你的任务,因为
CONCAT(first_name, ' ', last_name) LIKE ?
不一样
first_name LIKE ? or last_name LIKE ?
我不想生成一些自定义标准
我建议你这样做。我之前写过这样的限制
How can I concatenate two properties into one property using hibernate criteria query
您也可以尝试使用@Formula
,如上面的链接所述。
【讨论】:
关于第一点,谢谢,因为我不完全知道实体的构建顺序及其人口。关于第二点,我的问题很明确,因为用户输入可能是“John”、“White”或“John White”,其中“John”作为名字,“White”作为姓氏。第三点,令我惊讶的是,我在问了这个问题后才找到同一个帖子......有时我不知道确切的术语,例如这种情况下的“派生属性”......Thx。会接受你的回答。以上是关于查询后如何设置@Transient 字段值?使用 Hibernate Criteria 进行查询的主要内容,如果未能解决你的问题,请参考以下文章
Jpa + Spring - 从数据库读取后自动设置瞬态字段值