Hibernate HQL use
What 1.HQL that?
HQL ( Hibernate Query Language) statements hibernate is dedicated to query data, unlike SQL, HQL closer to the object-oriented way of thinking.
2. Why use HQL?
Avoid using HQL query using JDBC some drawbacks:
No need to write complicated SQL statements, query for an entity class and its properties;
Query results are stored directly in the List of objects, no package again;
Independent of the database, for automatically generating different databases of different SQL statements executed according to the configuration Hibernate dialect attribute.
3.HQL syntax
[select/update/delete……] from Entity [where……] [group by……] [having……] [order by……].
[Note]: HQL statement keywords are case insensitive, but the entity class and object properties are case sensitive.
4. Test JUnit test class HQL
Example 1:
public void hql1() { HQL String = "TeacherEntity from the SELECT t t" ; // create a query object Query Query = session.createQuery (HQL); // execute the query List <Object> List = Query.list (); for (Object obj: List) { System.out.println(((TeacherEntity) obj).getTeacherName() + "/" + ((TeacherEntity) obj).getTeacherClass()); } } @Test public void hql2() { String hql = "from TeacherEntity"; List<TeacherEntity> list = session.createQuery(hql).list(); for (TeacherEntity t : list) { System.out.println(t.getTeacherName() + "/" + t.getTeacherClass()); } }
These two results will be the same:
(1) Under what circumstances, do not write select
When we query is TeacherEntity all the properties, we can not write select. Such as: from TeacherEntity; of course also be written, but the format is changed to: select t from TeacherEntity (as) t; parentheses may not be written can be written as;
(2) Under what circumstances, write select
when we are no longer query all the attributes Man, we have to write on select. Such as: When we query TeacherEntity the name and class attributes, so we have to write: select t.name, t.class from TeacherEntity t ; can not aliases: select name, class from TeacherEntity;
(3) when the result of the query is an object may be received by Object, the receiving entity may be.
Example 2:
@Test public void hql3() { String hql = "from TeacherEntity where teacherName=? "; List<TeacherEntity> list = session.createQuery(hql).setParameter(0, "陈老师").list(); for (TeacherEntity t : list) { System.out.println(t.getTeacherName() + "/" + t.getTeacherClass()); } } @Test public void hql33() { String hql = "from TeacherEntity where teacherName=:name "; List<TeacherEntity> list = session.createQuery(hql).setParameter("name", "陈老师").list(); for (TeacherEntity t : list) { System.out.println(t.getTeacherName() + "/" + t.getTeacherClass()); } }
HQL use placeholders:
(1) placeholder measure from the index 0;
(2) the use of the above named parameters.
Example 3:
@Test public void hql4() { String hql = "select teacherName,teacherClass from TeacherEntity where teacherClass=?"; List<Object[]> list = session.createQuery(hql).setParameter(0, "Java1").list(); for (Object[] objs : list) { System.out.println(objs[0].toString() + "/" + objs[1].toString()); } } @Test public void hql5() { String hql = "select new com.project.hibernate.dto.TeacherDto(teacherName,teacherClass) from TeacherEntity where teacherClass=?"; List<TeacherDto> list = session.createQuery(hql).setParameter(0, "Java1").list(); for (TeacherDto dto : list) { System.out.println(dto.getUserName() + "/" + dto.getUserClass()); } } @Test public void hql6() { String hql = "select new map(teacherName,teacherClass) from TeacherEntity where teacherClass=?"; List<Map> list = session.createQuery(hql).setParameter(0, "Java1").list(); for (Map map : list) { System.out.println(map.get("0") + "/" + map.get("1")); } }
When we query object properties of more than one, you can use an array of objects to receive results;
Can also be used a temporary data transfer object is received (dto), configured to have a method in which a corresponding dto;
Map can also use received, the results obtained on the key map button are "0", "1", "2", "3" ....., the value of the corresponding attribute.
Example 4 (fuzzy query):
// fuzzy query @Test public void hql8 () { String hql = "select new map(teacherName,teacherClass) from TeacherEntity where teacherClass like ?"; List<Map> list = session.createQuery(hql).setParameter(0, "%J%").list(); for (Map map : list) { System.out.println(map.get("0") + "/" + map.get("1")); } }
Example 5 (associated with the query):
// related inquiries @Test public void hql9 () { String hql = "select new map(s.studentName,t.teacherName,t.teacherClass) from StudentEntity s left join s.teacher t where t.teacherName=? "; List<Map> list = session.createQuery(hql).setParameter(0, "陈老师").list(); for (Map map : list) { System.out.println(map.get("0") + "/" + map.get("1") + "/" + map.get("2")); } }
Because entity class already mapped foreign key table students and teachers table's primary key, so here goes like SQL write "on s.f_t_id = t.t_id".
Example 6 (paging query):
// paging query @Test public void hql10 () { // current page int currPage =. 4 ; // page shows the number of int the pageSize =. 5 ; String hql = "from TeacherEntity where teacherName like ?"; List<TeacherEntity> list = session.createQuery(hql).setParameter(0, "%刘老师%"). setFirstResult((currPage - 1) * pageSize).setMaxResults(pageSize).list(); for (TeacherEntity t : list) { System.out.println(t.getTeacherName()); } }
Query object provides an easy method of paging:
setFirstResult (int firstResult) method sets the starting index (equivalent to the limit (a, b) a);
setMaxResults (int maxResults) method returns the setting of the maximum number of records (b equivalent to the limit (a, b)).
Example 7 (returns a result object):
// Returns an object @Test public void hql11 () { String hql = "from TeacherEntity where teacherName=?"; TeacherEntity t = (TeacherEntity) session.createQuery(hql).setParameter(0, "陈老师").uniqueResult(); System.out.println(t.getTeacherName() + "/" + t.getTeacherClass()); }
Examples of determining when to return with only one, or null The uniqueResult () method.
Example 7 (deleting and modifying objects):
// delete the object @Test public void hql12 () { String hql = "delete from TeacherEntity where teacherName=?"; int i = session.createQuery(hql).setParameter(0, "刘老师19").executeUpdate(); System.out.println(i); } // modify objects @Test public void hql13 () { String hql = "update TeacherEntity set teacherName=? where teacherId=?"; int i = session.createQuery(hql).setParameter(0, "测试修改").setParameter(1, "40288ae670f5d8a30170f5d8a5e90011").executeUpdate(); System.out.println(i); }
Hibernate using SQL
@Test public void sql() { String sql = "select * from sys_teacher"; Query NativeQuery = session.createNativeQuery (SQL); // to check out the data into the entity, the entity needs to be managed hibernate query.addEntity (TeacherEntity. Class ); List<TeacherEntity> list = query.list(); for (TeacherEntity t : list) { System.out.println(t.getTeacherName()); } } @Test public void sql2() { String sql = "select t_name,t_class from sys_teacher"; List<Object[]> list = session.createNativeQuery(sql).list(); for (Object[] objs : list) { System.out.println(objs[0].toString() + "/" + objs[1].toString()); } }