【问题标题】:Hibernate HQL query by using like operator使用like运算符休眠HQL查询
【发布时间】: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 &gt; 22100 and userId &lt; 22200。根据您的数据库引擎和表大小,差异可能会非常大(因为索引将在此处使用,但不会用于 LIKE)
  • @ChssPly76 感谢您的回复。这真是个好主意。在那种情况下,我认为我需要使用正则表达式来检索其前缀。但是有一些限制,因为在某些情况下,我需要检索一些孩子,而不是全部。因此,您的解决方案可能无法按预期工作。

标签: hibernate hql sql-like


【解决方案1】:

嗯,LIKE 运算符通常用于文本数据,即 VARCHAR 或 CHAR 列,并且您有数字 id 列 (INTEGER)。

也许您可以尝试将id 字段也映射为字符串并在查询中使用该字段。这可能会或可能不会工作,具体取决于您的数据库引擎。请注意,您应该通过setId() 处理所有更新,并将idAsString 字段视为只读字段。

@实体 公共类用户{ 私人整数 id; 私有字符串 idAsString; @ID; 私人整数 getId() { 返回这个.id; } 私人无效setId(整数id){ 这个.id = id; } @Column(name="id", 可插入=false, 可更新=false) 私人字符串 getIdAsString() { 返回 this.idAsString; } 私人无效 setIdAsString(字符串 idAsString){ this.idAsString = idAsString; } }

那么查询将是:

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.idAsString like :userId");
List<User> userList = query.setParameter("userId", userId + "%").list();

【讨论】:

    【解决方案2】:

    根据 Hibernate 参考:

    str() 用于将数值或时间值转换为可读字符串

    所以当我使用

    from User u where str(u.id) like :userId
    

    效果很好

    【讨论】:

    • 是的。 str() 给了我解决方案。我在同样的问题上苦苦挣扎,因为我的实体类有 LONG 字段。我使用了类似 Hibernate 的运算符,它给了我强制转换异常。使用 Hibernate str() 方法找到的解决方案,我使用了 hibernate 查询。请查找示例查询。 select b.billNumber from Bill b where str(b.billNumber) like :billNumber").setString("billNumber,your_parameter).list();
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2011-05-24
    • 2023-03-10
    相关资源
    最近更新 更多