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.String
bbb_8 class java.lang.String
bbb_7 class java.lang.String
bbb_6 class java.lang.String
bbb_5 class java.lang.String
bbb_4 class java.lang.String
bbb_3 class java.lang.String
bbb_2 class java.lang.String
bbb_14 class java.lang.String
bbb_13 class java.lang.String
bbb_12 class java.lang.String
bbb_11 class java.lang.String
bbb_10 class java.lang.String
bbb_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.name
From s_emp e,department d
Where e.department = d.id()
左/右连接同理,()所在的另一侧为连接的方向,左连接说明=号左侧的所有记录都会显示出来,无论与右边是否获得匹配,两种书写方式,第二种代码简单使用较为广泛
SQL中的内连接(第一种方式)
Select e.id e.name,d.name from s_emp e,department d
Where e.departmentId = d.id;
SQL中的内连接(第二种方式)
Select e.id e.name,d.name from s_emp e inner join department d
on 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