【发布时间】:2010-12-26 12:55:06
【问题描述】:
Seu 如下映射
@Entity
public class User {
private Integer id;
@Id;
private Integer getId() {
return this.id;
}
}
通知 id 是一个整数。现在我需要这个 HQL 查询,使用 like 运算符
Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.id like :userId");
ATT:它是 like 运算符 NOT =(等于运算符)
然后我用
List<User> userList = query.setParameter("userId", userId + "%").list();
但不起作用,因为 Hibernate 抱怨 IllegalArgumentException 发生调用 User.id 的 getter
即使我使用
query.setString("userId", userId + "%");
没有用
我应该使用什么来传递查询?
【问题讨论】:
-
您使用的是什么数据库引擎?
-
@Arthur - 没有回答你的问题(似乎你自己已经想通了)但我只想问 - 为什么?我真的很感兴趣 - 你有什么用例需要 LIKE 比较似乎是代理键的东西?
-
@ChssPly76 - 嗨 Chss。这是一个遗留系统。它是一个树结构,其中父组 id 匹配所有孩子的 id。例如,如果我有一个组 id = 22100 并且我想检索它的孩子,通过匹配 221 前缀,我使用 >>> 像 '221%'。
-
@Arthur - 我明白了。考虑到基础列是数字的(并且,作为一个 PK,可能是索引的),您可能会在进行数字比较时获得更好的性能。例如。对于上面的示例,您可以使用
where userId > 22100 and userId < 22200。根据您的数据库引擎和表大小,差异可能会非常大(因为索引将在此处使用,但不会用于 LIKE) -
@ChssPly76 感谢您的回复。这真是个好主意。在那种情况下,我认为我需要使用正则表达式来检索其前缀。但是有一些限制,因为在某些情况下,我需要检索一些孩子,而不是全部。因此,您的解决方案可能无法按预期工作。