===== Native SQL Queries in Hibernate =====
In Hibernate können mit HQL und SQL direkt Abfragen auf die Datenbank formuliert werden.
===Beispiele:===
Einfaches SQL Beispiel mit Bindvariablen Verwendung und Blätterfunktion.
Das Ergebnis wird in die Entity Klasse Emp transformiert.
query = session.createSQLQuery("select * from EMP where EMPNO > :ID").addEntity(Emp.class);
query.setDouble("ID", 10000);
query.setCacheable(true);
query.setFirstResult(10);
query.setMaxResults(20);
emps = (List)query.list();
for (Emp e : emps) {
e.toString();
}
System.out.println("----------------------------------");
Namen und Datentypen der Ergebnis Spalten setzen, Bind Variable übergeben und Werte ausgeben:
// SQL Query mit Verwendung mit AddScalar
// vor Hibernate 4 Hibernate.STRING => StringType.INSTANCE
query = session.createSQLQuery("select * from EMP where EMPNO > :ID")
.addScalar("EMPNO", IntegerType.INSTANCE)
.addScalar("ENAME",StringType.INSTANCE)
.addScalar("JOB",StringType.INSTANCE)
.addScalar("MGR",FloatType.INSTANCE)
.addScalar("HIREDATE",DateType.INSTANCE)
.addScalar("SAL",FloatType.INSTANCE)
.addScalar("COMM",FloatType.INSTANCE)
.addScalar("DEPTNO",IntegerType.INSTANCE);
query.setDouble("ID", 10000);
query.setCacheable(true);
List
Wert über eine Map ausgeben:
query = session.createSQLQuery("select * from EMP where EMPNO > :ID")
.addScalar("EMPNO", IntegerType.INSTANCE)
.addScalar("ENAME",StringType.INSTANCE)
.addScalar("JOB",StringType.INSTANCE)
.addScalar("MGR",FloatType.INSTANCE)
.addScalar("HIREDATE",DateType.INSTANCE)
.addScalar("SAL",FloatType.INSTANCE)
.addScalar("COMM",FloatType.INSTANCE)
.addScalar("DEPTNO",IntegerType.INSTANCE);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
query.setDouble("ID", 10000);
query.setCacheable(true);
List data = query.list();
for (Object o : data) {
Map row = (Map)o;
System.out.print("Emp Name: " + row.get("ENAME"));
System.out.println(", Salary: " + row.get("SAL"));
}
System.out.println("----------------------------------");
Ergebnis einer eigenen Klassen zuweisen. Diese Klasse muss keine Enity Klasse sein, aber die get und set Methoden müssen 1zu1 mit den Spaltennamen des Resultsets des Ergebnisses übereinstimmen:
query =
session.createSQLQuery("select e.ename, e.hiredate, d.dname, d.loc from emp e, dept d where e.deptno=d.deptno and e.empno > 10000")
.addScalar("ename")
.addScalar("hiredate")
.addScalar("dname")
.addScalar("loc")
.setResultTransformer(Transformers.aliasToBean(EmpDept.class));
query.setCacheable(false);
List empDepts = (List)query.list();
System.out.println("----------------------------------");
System.out.println("Count of Emps :: " + empDepts.size());
System.out.println("----------------------------------");
for (EmpDept e : empDepts) {
System.out.println(e.toString());
}
==== Quellen ====
* http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch13.html#d5e3663
* http://www.tutorialspoint.com/hibernate/hibernate_native_sql.htm
* http://relation.to/2133.lace
* http://jonathanhui.com/hibernate-session-api
* http://www.aviyehuda.com/blog/2009/12/29/hibernate-lesson2-queries/
* http://levelup.lishman.com/hibernate/hql/joins.php
* http://www.javalobby.org/articles/hibernate-query-101/
* http://www.roseindia.net/hibernate/examples/criteria/hibernate-criteria-join-api.html
* http://www.roseindia.net/hibernate/examples/criteria/hibernate-criteria.html
* http://stackoverflow.com/questions/10829197/how-to-return-object-type-instead-of-listobject-in-hibernate
* http://www.tutorialspoint.com/hibernate/hibernate_native_sql.htm
Sehr gutes Hibernate Tutorial: http://javabrains.koushik.org/p/hibernate.html
Über den Hibernate Cache: http://www.codecentric.de/kompetenzen/publikationen/
=== Migration von Hibernate 3 nach 4 ===
* http://www.javacraft.org/2012/03/migrate-to-hibernate-4-ehcache.html