让我详细描述这个问题以避免X-Y情况。
我想使用Hibernate执行LIKE
查询来检索表Product
中的注册表,其中Product
的{{1}}将我的输入字符串作为全名。 SQL中的东西如:
User
我对Hibernate Criteria感到满意,但在这种情况下似乎没有办法在Criteria中组合列值搜索(我不想生成一些自定义Criteria),所以我试图使用{{ 1}},但我发现在某些情况下SELECT * FROM product WHERE id_user IN (SELECT id_user FROM users WHERE CONCAT(first_name, ' ', last_name) LIKE ?)
非常容易,而Restriction.sqlRestriction()
是不可能的,例如:
createAlia()
所以,我正在考虑另一种解决方案:在sqlRestriction
中创建一个criteria.createAlias("user.supervisor.teamleader", "uT");
字段来存储全名,连接@Transient
,User
和first_name
,因为现在数据库中不存在名为" "
的列,我不想触及表结构,这需要修改生产数据库。
如果我在last_name
类的默认构造函数中声明full_name
字段,当我从数据库中检索某个full_name
实体时,此字段将按照我的预期保存User
,或者是User
?
答案 0 :(得分:0)
如果我在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
,如上面的链接所述。