prog:java_hibernate_sql_native
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<Emp>)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<Object> qemps = (List<Object>)query.list(); System.out.println("----------------------------------"); System.out.println("Count of qemps :: " + qemps.size()); Iterator iterator = qemps.iterator(); System.out.println("Emp Id \t Name \t\t\t Hiredate"); while (iterator.hasNext()) { Object[] obj = (Object[])iterator.next(); Integer empno = (Integer)obj[0]; System.out.print(empno); String ename = (String)obj[1]; System.out.print("\t " + ename); Date hiredate = (Date)obj[4]; System.out.print("\t \t " + hiredate.toString()); System.out.println(); } System.out.println("----------------------------------");
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<EmpDept> empDepts = (List<EmpDept>)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
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
prog/java_hibernate_sql_native.txt · Zuletzt geändert: 2013/04/22 12:27 von gpipperr