Hibernate HQL-запрос с использованием оператора like - PullRequest
16 голосов
/ 14 декабря 2009

Сеу следующее отображение

@Entity
public class User {

    private Integer id;

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

}

Обратите внимание, что id является целым числом. Теперь мне нужен этот HQL-запрос с помощью оператора like

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

Даже когда я использую

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

не работает

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

Ответы [ 2 ]

29 голосов
/ 14 декабря 2009

Согласно Hibernate:

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

Так что, когда я использую

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

Работает нормально

7 голосов
/ 14 декабря 2009

Хорошо, оператор 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();
...