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
- Hibernate Query的小问题
- hibernate 中HQL 小问题:Query 的setParameter()参数不能为int,应该为Integer!
- hibernate Query list()的缓存问题
- hibernate Query list()的缓存问题二
- hibernate的小问题
- hibernate的小问题
- Hibernate的Query接口
- hibernate的Criteria Query
- Hibernate的Criteria Query
- Hibernate 的Criteria Query
- 使用hibernate的query查询时覆盖值的问题
- Hibernate的一个小问题
- hibernate的一些小问题
- 0075 Hibernate:Query.iterator()的N+1问题【基础】
- Hibernate 使用Query、SQLQuery 的setCacheable()设置缓存问题
- Hibernate : Query.list()、Query.iterate()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- Hibernate : Query.list()、Query.iterator()的区别
- 最快让你上手ReactiveCocoa之基础篇
- Sublime下安装Python插件
- hibernate进阶(6) 一对多映射
- 2.模型-视图-控制器 (MVC)
- Ubuntu Server上禁止服务
- Hibernate Query的小问题
- 关于"$M.Preferences的生命周期"
- JavaScript绑定事件的方法[3种]
- Apache ActiveMQ 单点集群配置方法
- 享元模式
- HTML元素之间有间隙原因以及解决办法
- Android获取CheckBox多选内容
- Exception in thread "http-8080-3" java.lang.OutOfMemoryError: PermGen space
- 去掉UISearchBar的那个灰色背景框