Запрос Hibernate HQL с использованием аналогичного оператора

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 + "%");

Не работает

Что я должен использовать для передачи запроса?

Ответы

Ответ 1

В соответствии с рекомендацией Hibernate:

str() используется для преобразования числовых или временных значений в читаемую строку

Поэтому, когда я использую

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

Он отлично работает

Ответ 2

Ну, оператор 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();