Hibernate Query的小问题

来源:互联网 发布:佶天鸿网络俱乐部招聘 编辑:程序博客网 时间:2024/05/20 23:37

Hibernate Query的小问题

List list1 = session.createQuery        ("SELECT address "//                + "FROM com.test.User "//                + "where id<15 "//                + "GROUP BY address "//                + "ORDER BY address DESC ")//                .list();

输出如下

bbb_9  class java.lang.Stringbbb_8  class java.lang.Stringbbb_7  class java.lang.Stringbbb_6  class java.lang.Stringbbb_5  class java.lang.Stringbbb_4  class java.lang.Stringbbb_3  class java.lang.Stringbbb_2  class java.lang.Stringbbb_14  class java.lang.Stringbbb_13  class java.lang.Stringbbb_12  class java.lang.Stringbbb_11  class java.lang.Stringbbb_10  class java.lang.Stringbbb_1  class java.lang.String

这就造成了一个很尴尬的局面:DESC排序条件下bbb_9大于bbb_14

补充一点SQL知识点:
SQL中的左连接(第一种方式)

Select e.id,e.name,d.name From s_emp e left join  department d on e.departmentid=d.id;

SQL中左连接(第二种方式)

Select e.id e.name,d.nameFrom s_emp e,department dWhere e.department = d.id()

左/右连接同理,()所在的另一侧为连接的方向,左连接说明=号左侧的所有记录都会显示出来,无论与右边是否获得匹配,两种书写方式,第二种代码简单使用较为广泛

SQL中的内连接(第一种方式)

Select e.id e.name,d.name from s_emp e,department dWhere e.departmentId = d.id;

SQL中的内连接(第二种方式)

Select e.id e.name,d.name from s_emp e inner join department don e.departmentId = d.id;

内连接取的是两个表的交集(前提是有能连接的字段),使用内连接可获取两个表公共部分的记录

HQL中的内/左/右连接

SELECT e.id,e.name,d.name FROM s_emp e INNER JOIN e.department d;SELECT e.id,e.name,d.name FROM s_emp e LEFT JOIN e.department d;SELECT e.id,e.name,d.name FROM s_emp e RIGHT JOIN e.department d;

更简单的代码如下(获得s_emp的department属性,再获得department表下的name属性)

SELECT e.id,e.name,e.department.name FROM s_emp e;

HQL中使用占位符

        Session session = sessionFactory.openSession();        session.beginTransaction();        List list = session.createQuery(                "FROM com.test.User WHERE id IN (:ids)")                .setParameterList("ids", new Object[]{1,5,25})                .list();         for (Object obj : list) {            System.out.println(obj);            System.out.println(obj.getClass());        }        session.beginTransaction().commit();        session.close();

PS:SetParamterList的参数没有int型,所以只能用属性占位的方式

不使用属性占位的方式如下

List list = session.createQuery(                "FROM com.test.User WHERE id BETWEEN ? AND ?")                .setParameter(0,5)                .setParamter(1,10)//0`1为索引                .list();         for (Object obj : list) {            System.out.println(obj);            System.out.println(obj.getClass());        }//使用?占位符,再调用setParamter方法传入参数有利于代码复用

HQL语句的命名查询:
将query语句写在配置文件中,注意在配置文件中有些字符需转义,常用的处理方法为在配置文件中做如下配置

<query name = "HQL语句名xxx">            <![CDATA[FROM com.test.User WHERE id BETWEEN :ids AND :ids]]></query>//代表这段Query语句中没有需要转义的字符

不采用硬编码的方式,而是把HQL语句放在配置文件中,最好配置文件也书写映射关系

List list1 = session.getNamedQuery("HQL语句的名字")                .setParameter("ids", 5)                .setParameter("ids", 10)                .list();//

注意:UPDATE和DELETE方法不会通知Session缓存,即操作了数据库但缓存中还未更新,解决方法:调用refresh()方法刷新缓存中的状态–重新执行SELECT语句
Session中的几个常用方法flush/clear/evict/reflesh

*事务并发–事务隔离级别:引用一篇文章
事务隔离级别详解*
PS:修改事务隔离级别根据需要在hibernate.cfg.xml中修改
Read Uncommitted 、Read Committed 、Repeatable Read 、Serializable 分别对应1、2、4、8

1 0
原创粉丝点击