In Hibernate können mit HQL und SQL direkt Abfragen auf die Datenbank formuliert werden.
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()); }
Sehr gutes Hibernate Tutorial: http://javabrains.koushik.org/p/hibernate.html
Über den Hibernate Cache: http://www.codecentric.de/kompetenzen/publikationen/