Hibernate Query的小问题

本文介绍了Hibernate查询语言(HQL)的基本用法,包括不同类型的连接查询、参数设置及命名查询等高级特性,并通过具体代码示例展示了如何进行有效的数据库查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值