查询后如何设置@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 中的注册表,其中ProductUser 将我的输入字符串作为全名。 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 - 从数据库读取后自动设置瞬态字段值

由于 Hibernate Mapping 需要将某些字段设置为 @Transient 但 JSP 无权访问它们

java中transient的用法

oracle中如何修改日期类型的字段值

当值为空时如何取消设置属性?

hibernate创建本地查询后进行查询的时候报错: could not execute query;列名无效