Seu следующее отображение
@Entity
public class User {
private Integer id;
@Id;
private Integer getId() {
return this.id;
}
}
Заметьте, что идентификатором является Целое число. Теперь мне нужен этот запрос HQL при помощи подобного оператора
Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.id like :userId");
ATT: IT ПОХОЖ на оператор NOT = (равняется оператору),
Тогда я использую
List<User> userList = query.setParameter("userId", userId + "%").list();
Но не работает, потому что В спящем режиме, жалуется, что IllegalArgumentException произошел, звоня методу get User.id
Даже когда я использую
query.setString("userId", userId + "%");
Это не работает
Что я должен использовать для передачи запроса?
Согласно ссылке на Hibernate:
str () используется для преобразования числовых или временных значений в читаемую строку
Поэтому, когда я использую
from User u where str(u.id) like :userId
, он отлично работает
Что ж, оператор 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();