2009-12-14 8 views
13

Seu le mappage suivantHibernate HQL requête en utilisant comme opérateur

@Entity 
public class User { 

    private Integer id; 

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

} 

id Avis est un nombre entier. Maintenant, j'ai besoin de cette requête HQL en utilisant comme opérateur

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

ATT: IL EST comme opérateur NOT = (opérateur égal)

Puis-je utiliser

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

mais ne fonctionne parce que Hibernate se plaint IllegalArgumentException s'est produite appel getter de User.id

Même quand j'utilise

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

Il ne fonctionne pas

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

+0

Quel est le moteur base de données que vous utilisez? –

+0

@ Arthur - ne pas répondre à votre question (semble que vous avez compris par vous-même de toute façon) mais je dois juste demander - pourquoi? Je suis vraiment intéressé - quel cas d'utilisation avez-vous qui exige LIKE comparaison pour ce qui semble être une clé de substitution? – ChssPly76

+0

@ ChssPly76 - Salut Chss. C'est un système hérité. C'est une structure arborescente dans laquelle un identifiant de groupe parent correspond à l'identifiant de tous les enfants. Par exemple, si j'ai un id de groupe = 22100 et que je veux récupérer ses enfants, en utilisant le préfixe 221, j'utilise >>> comme '221%'. –

Répondre

25

Selon référence Hibernate:

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

Alors quand j'utilise

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

Il fonctionne très bien

+0

Oui c'est. str() m'a donné la solution. J'ai lutté avec le même problème parce que ma classe d'entité a un champ LONG. J'ai utilisé Hibernate comme opérateur et il m'a donné l'exception cast. Solution trouvée avec la méthode Hiberanate str() et j'ai utilisé les requêtes hibernate. S'il vous plaît trouver un exemple de requête. sélectionnez b.billNumber de Bill b où str (b.billNumber) comme: billNumber "). setString (" billNumber, your_parameter) .list(); –

+0

excellente solution. Charmant... – bynu022

7

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).

Peut-être que vous pourriez essayer de mapper le champ id aussi sous forme de chaîne et utiliser ce champ dans la requête. Cela peut ou peut ne pas fonctionner en fonction de 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.

 
@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; 
    } 
} 

Ensuite, la requête serait:

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