web-dev-qa-db-fra.com

Hiberner la requête HQL en utilisant un opérateur similaire

Seu le mappage suivant

@Entity
public class User {

    private Integer id;

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

}

Remarquez que id est un entier. Maintenant, j'ai besoin de cette requête HQL en utilisant un opérateur similaire

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.id like :userId");

ATT: IT IS comme opérateur PAS = (égal opérateur)

Ensuite j'utilise

List<User> userList = query.setParameter("userId", userId + "%").list();

Mais cela ne fonctionne pas car Hibernate se plaint que IllegalArgumentException s'est produite en appelant le getter de User.id

Même quand j'utilise

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

Ça ne marche pas

Que dois-je utiliser pour transmettre la requête?

16
Arthur Ronald

Selon la référence Hibernate:

str () est utilisé pour convertir des valeurs numériques ou temporelles en une chaîne lisible

Alors quand j'utilise

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

Ça fonctionne bien

29
Arthur Ronald

Eh bien, l'opérateur LIKE est généralement utilisé avec des données textuelles, c'est-à-dire avec des colonnes VARCHAR ou CHAR, et vous avez une colonne numérique id (INTEGER).

Vous pouvez peut-être essayer de mapper le champ id également en tant que chaîne et utiliser ce champ dans la requête. Cela peut ou non fonctionner selon votre moteur de base de données. Notez que vous devez gérer toutes les mises à jour via setId() et considérer le champ idAsString comme étant en lecture seule.

 @ Entité 
 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 ( ) {
 renvoie this.idAsString; 
} 
 
 private void setIdAsString (String idAsString) {
 this.idAsString = idAsString; 
} 
} 

La requête serait alors:

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.idAsString like :userId");
List<User> userList = query.setParameter("userId", userId + "%").list();
7
Juha Syrjälä