2009-12-14 9 views
13

Seu la seguente mappaturainterrogazione Hibernate HQL utilizzando come operatore

@Entity 
public class User { 

    private Integer id; 

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

} 

Avviso id è un numero intero. Ora ho bisogno di questa query HQL utilizzando come operatore

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

ATT: E 'come operatore NOT = (uguale operatore)

allora io uso

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

Ma non lo fa lavoro perché Hibernate si lamenta IllegalArgumentException si è verificato chiamando getter di User.id

Anche quando uso

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

non funziona

Cosa devo usare per passare la query?

+0

Cosa motore di database che si sta utilizzando? –

+0

@Arthur - non rispondere alla tua domanda (sembra che tu l'abbia capito da solo in ogni caso) ma devo solo chiedere - perché? Sono sinceramente interessato - quale caso d'uso hai che richiede il confronto LIKE per quella che sembra essere una chiave surrogata? – ChssPly76

+0

@ ChssPly76 - Ciao Chss. È un sistema legacy. È una struttura ad albero in cui un id del gruppo principale corrisponde a tutti gli id ​​dei bambini. Ad esempio, se ho un id di gruppo = 22100 e voglio recuperare i suoi figli, facendo corrispondere il prefisso 221, uso >>> come "221%". –

risposta

25

Secondo Sospensione riferimento:

str() viene utilizzata per convertire i valori numerici o temporali a una stringa leggibile

Quindi quando uso

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

Funziona bene

+0

Sì, lo è. str() mi ha dato la soluzione. Ho faticato con lo stesso problema perché la mia classe di entità ha campo LONG. Ho usato l'operatore Hibernate e mi ha dato un'eccezione. Soluzione trovata con il metodo Hiberanate str() e ho usato le query di ibernazione. Si prega di trovare la query di esempio. selezionare b.billNumber da Bill b dove str (b.billNumber) come: billNumber "). setString (" billNumber, your_parameter) .list(); –

+0

ottima soluzione. Charming ... – bynu022

7

Bene, l'operatore LIKE viene in genere utilizzato con dati testuali, vale a dire con colonne VARCHAR o CHAR, ed è presente la colonna numerica id (INTEGER).

Forse potresti provare a mappare il campo id anche come stringa e utilizzare quel campo nella query. Questo potrebbe funzionare o meno a seconda del tuo motore di database. Si noti che è necessario gestire tutti gli aggiornamenti tramite setId() e considerare il campo idAsString di sola lettura.

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

Poi la query sarebbe:

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