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