[Erledigt] Hibernate hql-Query als Criterion


#1

Hallo,
ich habe einen HQL-Query mit einer trim() Funktion.

FROM kunde k WHERE trim(k.name) = ?

Wie bekommt man das trim(…) in ein Criterion.
session.createCriteria(Kunde.class)
.add( … )

müsste der Anfang sein.

Ich hoffe, es ist klar, was ich will?

Gruß,
Werner


#2

Du kannst das mit einer SQL-Restriction lösen:

c.add(Restrictions.sqlRestriction("trim({alias}.name)=?", derName);

#3

Danke hat mir sehr geholfen.

Unschön ist, das die Hibernate-Funktion trim() bei einer DB2 durch ltrim(rtrim(…)) ausgetauscht werden muss und die Anwendung dadurch DB2-Abhängig wird. :frowning: Ist halt eine sqlRestriction…


#4

machs doch per Java mit String.trim()


#5

Ich kann Millionen von Einträgen nicht erstmal laden, um sie zu trimmen. Das muss Datenbankseitig erfolgen.


#6

Wozu überhaupt trimmen? Hast du etwa char statt varchar als Datentyp verwendet?


#7

achso, ich dachte das wäre um in die DB zu schreiben, dann Aussage ignorieren :wink:


#8

Ich wars nicht! Und ich kann daran nichts ändern! :slight_smile:


#9

[QUOTE=Unregistriert]Danke hat mir sehr geholfen.

Unschön ist, das die Hibernate-Funktion trim() bei einer DB2 durch ltrim(rtrim(…)) ausgetauscht werden muss und die Anwendung dadurch DB2-Abhängig wird. :frowning: Ist halt eine sqlRestriction…[/QUOTE]

Ich hab noch nicht viel mit DB2 gemacht, aber kannst du Stored Procedures einfach so aufrufen “SELECT trim(col) FROM tab”?
Wenn ja dann schreib dir doch ne Funktion trim die ltrim,rtrim aufruft schon biste wieder unabhängig von DB2.


#10

Wenn es wirklich das char/varchar-Problem ist könntest du den Vergleich mit LIKE machen, also “… WHERE name LIKE ‘dername%’”


#11

[quote=EagleEye]Ich hab noch nicht viel mit DB2 gemacht, aber kannst du Stored Procedures einfach so aufrufen “SELECT trim(col) FROM tab”?
Wenn ja dann schreib dir doch ne Funktion trim die ltrim,rtrim aufruft schon biste wieder unabhängig von DB2.[/quote]

Ich kann nur über eine andere Person an die DB und weiß auch nicht, ob das so geht. Der Witz an der Sache ist ja, dass das Hibernate-HQL ganz oben mit trim funktioniert, weil Hibernate aus dem trim ltrim,rtrim macht. Ich habe daher erwartet, dass es auch mit der Criterias(-ons ?) geht.

Alternativ müsste ich auf die Criterias verzichten, was aber eine größere Änderung nach sich ziehen würde. Mit den Spring-Hibernate-Template kann man nämlich mit Criterias seitenweises Paging durch die Daten realisieren.

Wenn ich simples HQL nehme, dann kann man zwar die Fetchsize oder die Anzahl der Resultsets bestimmen, aber kann nicht (?) sagen, bitte 50 Elemente **ab der Position 1056. **

Ich nehme an,n ich müssen statt dem Spring-Hibernate-Teplate direkt ein Hibernate-Session oder Query nehmen… Nur ist das eine größere Änderung, die getestet werden müste… Tja.


#12

[QUOTE=Unregistriert]Ich kann nur über eine andere Person an die DB und weiß auch nicht, ob das so geht. Der Witz an der Sache ist ja, dass das Hibernate-HQL ganz oben mit trim funktioniert, weil Hibernate aus dem trim ltrim,rtrim macht. Ich habe daher erwartet, dass es auch mit der Criterias(-ons ?) geht.

Alternativ müsste ich auf die Criterias verzichten, was aber eine größere Änderung nach sich ziehen würde. Mit den Spring-Hibernate-Template kann man nämlich mit Criterias seitenweises Paging durch die Daten realisieren.

Wenn ich simples HQL nehme, dann kann man zwar die Fetchsize oder die Anzahl der Resultsets bestimmen, aber kann nicht (?) sagen, bitte 50 Elemente **ab der Position 1056. **

Ich nehme an,n ich müssen statt dem Spring-Hibernate-Teplate direkt ein Hibernate-Session oder Query nehmen… Nur ist das eine größere Änderung, die getestet werden müste… Tja.[/QUOTE]

Das geht auch ganz trivial per HQL-Query:

hibernateTemplate.execute(new HibernateCallback() {

            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Query query = session.createQuery("from Blub");
                query.setFirstResult(1056);
                query.setFetchSize(50);
                return query.list();
            }
            
        });

Die Criteria API ist zwar nett, an manchen Ecken aber leider noch nicht so ausgereift wie HQL.