Ответ 1
В соответствии с рекомендацией Hibernate:
str() используется для преобразования числовых или временных значений в читаемую строку
Поэтому, когда я использую
from User u where str(u.id) like :userId
Он отлично работает
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();
Но не работает, потому что Hibernate жалуется на исключение IllegalArgumentException, вызывающее getter 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();