# Hibernate hql suche Date



## DreamArtist (14. Aug 2006)

Halloliebe Javaner,

ich habe gleich mal ein zweites Problem, diesmal mit Hibenate.


Der Benutzer kann als  Suchkriterium ein Datum eingeben.
Mit diesem String möchte ich nun ein Query auf meiner Oracle machen.

Beispiel:


```
private KAPat sucheAufnahmen(KAPat patient, Date von, Date bis, String bearbKz){
		Set idTeile = patient.getKaIdTeil();
		Set idT2 = new HashSet();
		Iterator idTeileIterator = idTeile.iterator();
		Expression ex = null;

		String datumVon = Datum.convertDate2String(
				von,
				Datum.TT_MM_JJJJ,
				Datum.TRENNER_PUNKT,
				Datum.TRENNER_PUNKT);
		String datumBis = Datum.convertDate2String(
				bis,
				Datum.TT_MM_JJJJ,
				Datum.TRENNER_PUNKT,
				Datum.TRENNER_PUNKT);
		String hql2 = "from KAK01Aufn ";
		boolean erster = true;
		
		while(idTeileIterator.hasNext()){
			KAIDTeil teil = (KAIDTeil)idTeileIterator.next();		
			
			if(erster){				
				erster=false;
				hql2 += " where ( ";
			}
			else{
				hql2 += " OR (";
			}
			hql2+= " kaIdTeil=" + teil.getId().longValue();
			if(von != null){
				hql2 += " AND aufnDat >= '" 
					+ datumVon + "' ";
			}
			if(bis!= null){
				hql2 += " AND aufnDat <= '" + datumBis + "'";
			} 
			if(bearbKz!=null){
				hql2 += ") ";
			}
			else{
				hql2 +=" AND bearbKz='" + bearbKz + "') ";
			} 
			if(bearbKz!=null){
				hql2 += ") ";
			}
			else{
				hql2 +=" AND bearbKz='" + bearbKz + "') ";
			}
			
		}//Ende der iteration der IDTeile
		hql2 += " ORDER by aufnDat";
		Iterator it1 = super.find(hql2).iterator();	
	}
```

Natürlich bekomme ich jetzt den Fehler das JJJJ-MM-TT ein ungültiges Format für Oracle ist.
Meine Testfälle verwenden jedoch dieses Format und Hibernate soll ja so portierbar sein.

Habe es auch schon mittels


```
Criteria criteria = session.createCriteria(KAK01Aufn.class);
if (startDate != null) {
	criteria.add(Expression.ge("aufnDat",von);
}
if (endDate != null) {
	criteria.add(Expression.le("aufnDat",bis);
}
List results = criteria.list();
```

versucht, bekomme dann aber bei dem Query das Date im Query als das toString() Date.

Kann mir jemand sagen wie ich das Query aufbauen muss?

Vielen Dank DreamArtist


----------



## KSG9|sebastian (14. Aug 2006)

dieses Stringgefrickel ist total unübersichtlich, verwende mal den StringBuffer(1.4) respektive StringBuilder (1.5)

Hibernate hat doch nen eigenen Datums-Typ, oder?


----------



## AlArenal (14. Aug 2006)

KSG9|sebastian hat gesagt.:
			
		

> Hibernate hat doch nen eigenen Datums-Typ, oder?



Die haben sogar ein eigenes Forum. Sogar ein deutsches


----------



## DreamArtist (14. Aug 2006)

String -> Stringbuilder --> Ja eh, aber ne dumme angewohnheit   
Java 1.5 wir bei uns noch nicht verwendet.


zurück zum thema:

Es gibt nur die Klasse CalendarDateType von Hibernate. Und diese wird als rückgabewert verwendet.
Zumindest ist dies die einzige Klasse die ich in der Hibernate-Api finden konnte


----------



## HLX (14. Aug 2006)

Sollte Hibernate nicht die Konvertierung des Datums ins DB-spezifische Format übernehmen? Man kann einer Query jedenfalls als Parameter den Datentyp java.util.Date übergeben.

Also: nicht dem Framework die Arbeit abnehmen  :wink:


----------



## DreamArtist (14. Aug 2006)

HLX hat gesagt.:
			
		

> Man kann einer Query jedenfalls als Parameter den Datentyp java.util.Date übergeben.
> 
> Also: nicht dem Framework die Arbeit abnehmen  :wink:



Mach ich bei


```
Criteria criteria = session.createCriteria(KAK01Aufn.class);
if (startDate != null) {
   criteria.add(Expression.ge("aufnDat",von);
}
if (endDate != null) {
   criteria.add(Expression.le("aufnDat",bis);
}
List results = criteria.list();
```

jedoch wird dann wie erwähnt nur die toString() Methode der Klasse Date aufgerufen und diese hat in keinen Fall eine SQL taugliches Format


----------



## HLX (14. Aug 2006)

Hibernate kann nach verschiedenen Sprachen und Formaten der Datenbanken unterscheiden. Wie das genau funktioniert weiß ich auch nicht. Man kann jedenfalls irgendwo einen Datenbanktyp bzw. einen Dialekt angeben. Schau mal ins Package org.hibernate.dialect.


----------



## KSG9|sebastian (14. Aug 2006)

http://www.javalobby.org/articles/hibernate-query-101/

http://www.javalobby.org/articles/hibernatequery102/?source=archives

http://nhibernate.sourceforge.net/h2.0.3-docs/reference/html/query-language.html

u.s.w.

http://www.google.de/search?hl=de&q=hibernate+query+date&meta=


----------



## AlArenal (14. Aug 2006)

HLX hat gesagt.:
			
		

> Hibernate kann nach verschiedenen Sprachen und Formaten der Datenbanken unterscheiden. Wie das genau funktioniert weiß ich auch nicht. Man kann jedenfalls irgendwo einen Datenbanktyp bzw. einen Dialekt angeben. Schau mal ins Package org.hibernate.dialect.



Hat aber mit HQL nichts zu tun, schließlich soll Hibernate von der DB abstrahieren. Nur wer ganz mutig ist, kann auch natives SQL verwenden.


----------



## DreamArtist (22. Aug 2006)

Habe nun einen Weg gefunden:

Hier der Code dazu:


```
String hql2 = "from KAIDTeil as kaIdTeil where kaIdTeil.kaPat.vsnr='" + vsnr + "' ";
		if(von != null){
			hql2 += " AND kaIdTeil.aufnDat >= ? ";
		}
		if(bis!= null){
			hql2 += " AND kaIdTeil.aufnDat <= ?";
		}			
		if(bearbKz!=null && !bearbKz.equals("")){
			hql2 += " AND kaIdTeil.kaK01Aufn.bearbKz='" + bearbKz + "' ";
		}			
		if(aufenthaltString!=null && !aufenthaltString.equals("")){
			hql2 += " AND kaIdTeil.kaK01Aufn.kenn_s_a='" + aufenthaltString + "' ";
		}	
		hql2 += " ORDER by kaIdTeil.aufnDat";
		Query query = getSession().createQuery(hql2);
		if(von != null){
			query.setDate(0, von); 
		}
		if(bis!=null){
			if(von!=null){
				query.setDate(1, bis); 
			}
			else{
				query.setDate(0, bis); 
			}
		}
		return query.list();
```

Und ja, ich sollte einen StringBuffer verwenden  :wink:


----------

