2012-04-08 8 views
2

Ich möchte Bereichsabfrage tun wie,Hibernate Bereichsabfrage

wählen u.age von Benutzer u wo Alter zwischen 10 und 20. Diese 10 und 20 dynamische Werte sein.

Ich habe versucht, Parameter wie

a=10; 
b=20; 
Query q = session.createQuery("select u.age from user u where age between a and b"); 
q.setInteger("a",a); 
q.setInteger("b",b); 

Dies gibt mir Fehler. Mir fehlt etwas zwischen Wort und Wort. Kann mir jemand sagen, wie das erreicht werden kann?

+0

ure fehlt ":" s vor a und b, und "u.age" statt alt. ist das ein Tippfehler? Wenn ja, versuche 'u.age aus dem Benutzer auszuwählen, wo du zwischen: a und: b' gehst. – kommradHomer

Antwort

1

Sie müssen benannte Parameter angeben.

a=10; 
b=20; 
Query q = session.createQuery("select u.age from user u where age between :a and :b"); 
q.setInteger("a",a); 
q.setInteger("b",b); 
4

Die optimale Lösung ist die Verwendung eines Hibernate-Kriteriums anstelle von fest codierten SQL-Abfragen. Sie sollten eine Annotation @Entity für Ihre Benutzerklasse deklarieren und private Felder erstellen, die den Spalten Ihrer Tabelle entsprechen.

Angenommen, Sie haben eine Benutzertabelle mit einer ID, einem Namen und einem Alter. Die Benutzerklasse wird dann wie folgt aussehen:

@Entity 
@Table(name = "User") 
public class User{ 

    private long id; 
    private String userName; 
    private int age; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(unique = true, nullable = false) 
    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "userName", nullable = false) 
    public String getUserName() { 
     return this.userName; 
    } 

    @Column(name = "age") 
    public void setAge(int age) { 
     this.age = age; 
    } 

    public int getAge() { 
    return this.age; 
} 

Hinweis: wenn die Spalten in der Datenbanktabelle genau die gleichen Namen wie die Felder, die @Column (name = „..“) Anmerkung ist nicht erforderlich, .

Dann wäre die Alte Abrufen:

int userAge = session.createCriteria(User.class) 
         .add(Restrictions.ge("age", a)) 
         .add(Restrictions.le("age", b)) 
         .setProjection(Property.forName("age")) 
         .uniqueResult(); 

ein Kriterium von Benutzerklasse Erstellen sagt Hibernate ein aus User Tabelle zu machen. Dann bedeuten die Beschränkungen wobei Alter> = ein und Alter < = b sind. Die uniqueResult() sagt Hibernate, dass wir ein einzelnes Ergebnis erwarten, während die Projektion benötigt wird, um eine bestimmte Spalte abzurufen (die Projektion bedeutet wählen Alter von Benutzer). Wenn keine Projektion angegeben ist, würden die Kriterien standardmäßig die gesamte Klasse zurückgeben, d. H. Eine Auswahl * von Benutzer.

Ich weiß, dass dies etwas zu kompliziert erscheint für das, was Sie brauchen, aber die Arbeit mit Entitäten, die Ihren Tabellen und den Kriterien entsprechen, ist der richtige Weg.

+0

Ich lerne gerade Hibernate. Warum sind Kriterien besser als HQL? –

+0

Durch "besser" verstehe ich, dass es ein programmatisch korrekter Ansatz ist. Hard-Coding ist in keiner Hinsicht eine gute Lösung. Nehmen wir zum Beispiel den Fall, dass sich Ihre Datenbank ändert (einige Tabellen ändern beispielsweise ihre Spaltennamen oder Tabellenbeziehungen). Die Verwendung des HQL würde bedeuten, alle Ihre DAO-Klassen einzugeben (ich spreche von einer größeren Anwendung) und jeden einzelnen SQL-Aufruf so zu modifizieren, dass er mit der neuen Datenbank und ihren Beziehungen übereinstimmt. Die Verwendung von Kriterien würde nur die Eingabe der entsprechenden Klassen und das Umbenennen (Refactoring) der Felder erfordern. Dies ist nur ein sehr einfaches Beispiel. –