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?
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
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();