使用以下映射
@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 + "%");
不起作用
我应该使用什么来传递查询?
答案 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();