Hibernate学习5--Hql查询

Hql是Hibernate中较为强大的部分,其可以将java的实体对象和Sql相互关联起来,开发过程不必要传入具体的sql,只要专注于类对象的相关逻辑即可。

这里我们测试代码采用了注解的形式,这里要先配置一下注解的扫描位置,

 <property name="annotatedClasses">
            <list>
                <value>com.xiaoming.test.hibernate.studentTest.Student</value>
            </list>
        </property>

或者采用如下packeage格式的配置

 <property name="packagesToScan">
            <list>
                <value>com.xiaoming.test.hibernate.studentTest.*</value>
            </list>
        </property>

对应的注解方式写法如下:

@SuppressWarnings("serial")
@Entity
@Table(name="student1")
public class Student implements Serializable {
    @Id
    @Column(name="id")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    @Column(name="name")
    private String name;
}

Hibernate中有两种query方法,一种是createQuery,另一种是createSQLQuery。这两种方法的区别是前者可以使用hql语句查询,后者用sql语句查询,前者返回的是Hibernate生成的Bean对象,后者返回的是对象数组,但是也可以使用addEntity(xxx.class)映射成对应的bean返回。

我们先看看createSQLQuery的使用方法:

 public void testHql() {
        //list方法返回object的属性
        String hql="select * from student1 where id =1";
        Query query=session.createSQLQuery(hql);
        List result=query.list();
        for(int i=0;i<result.size();i++){
            Object[] objects = (Object[])result.get(i);
            for(int j=0;j<objects.length;j++){
                System.out.println(objects[j].getClass().getName());
            }
        }
        
        //list方法设置返回类型为Map
        String hq2="select * from student1 where id =1";
        Query query2=session.createSQLQuery(hql2);
        query2.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List result2=query2.list();
        for(int i=0;i<result2.size();i++){
            Map map = (Map) result2.get(i);
            System.out.println(map.get("id"));
        }
        
        //使用函数
        String hql3="select count(id) NUM from student1";
        Query query3=session.createSQLQuery(hql3).addScalar("NUM");
        query3.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List result3=query3.list();
        for(int i=0;i<result3.size();i++){
            Map map = (Map) result3.get(i);
            System.out.println(map.get("NUM"));
        }
    }

这里有个点要注意一下,除了list方法外,iterator也可以获取到对应的数据,他们的区别是list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据。iterator在默认情况下利用缓存数据,但如果缓存中不存在数据有可能出现N+1问题。

下面是createQuery的使用方法,其中Student大写表示对应的java对象。

 //采用:的方法标识传入参数
 String hql = "from Student o where id = :id";
        Query query = session.createQuery(hql);
        query.setParameter("id", 1);
        List result=query.list();
        for (Iterator iter=result.iterator(); iter.hasNext();) {
            Student student = (Student)iter.next();
            System.out.println(student.getName());
        }
        
        //采用?的方式标识参数
        String hql2 = "from Student o where id = ?";
        Query query2 = session.createQuery(hql2);
        query2.setParameter(0,1);
        List result2=query2.list();
        for (Iterator iter=result2.iterator(); iter.hasNext();) {
            Student student = (Student)iter.next();
            System.out.println(student.getName());
        }

        //可以使用setParameterList方法传入一系列参数
        String hql3 = "from Student o where id in (:ids)";
        Query query3 = session.createQuery(hql3);
        query3.setParameterList("ids",new Object[]{1,3});
        List result3=query3.list();
        for (Iterator iter=result3.iterator(); iter.hasNext();) {
            Student student = (Student)iter.next();
            System.out.println(student.getName());
        }

        //可以直接返回单一对象
        String hql4 = "select count(*) from Student";
        Query query4 = session.createQuery(hql4);
        Long result4= (Long) query4.uniqueResult();
        System.out.println(result4);

自此,Hql的内容和功能基本上学习的差不多了,从最开始的环境配置,相关概念,关联关系到今天的Hql使用,Hibernate基本上已经入门了。以后需要多多在项目中练习,有时间也可以看看相关的代码实现,特别是java对象和相关sql的转换那块。


你可能感兴趣的:(Hibernate学习5--Hql查询)