使用like运算符进行Hibernate HQL查询

时间:2009-12-14 18:40:06

标签: hibernate hql sql-like

使用以下映射

@Entity
public class User {

    private Integer id;

    @Id;
    private Integer getId() {
        return this.id;
    }

}

通知id是一个整数。现在我需要使用like运算符

来进行这个HQL查询
Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.id like :userId");

ATT:喜欢运算符NOT = (等于运算符)

然后我用

List<User> userList = query.setParameter("userId", userId + "%").list();

但是没有用,因为Hibernate抱怨IllegalArgumentException发生了调用User.id的getter

即使我使用

query.setString("userId", userId + "%");

不起作用

我应该使用什么来传递查询?

2 个答案:

答案 0 :(得分:29)

根据Hibernate参考:

  

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

所以当我使用

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

工作正常

答案 1 :(得分:7)

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

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

@Entity
public class User {

    private Integer id;
    private String idAsString;

    @Id;
    private Integer getId() {
        return this.id;
    }

    private void setId(Integer id) {
        this.id = id;
    }

    @Column(name="id", insertable=false, updatable=false)
    private String getIdAsString() {
       return this.idAsString;
    }

    private void setIdAsString(String 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();