【Hibernate】hql使用总结(下)

2024-08-26 19:38
文章标签 总结 使用 hibernate hql

本文主要是介绍【Hibernate】hql使用总结(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     上篇博客介绍了简单的hql语句,简单属性查询,实体类查询,条件查询以及对原生sql的支持,这篇博客继续介绍hql语句。

一、外置命名查询

     映射文件中使用<query>标签,并为该标签添加name属性,将字符串添加到程序中<![CDATA[]]>中,用session.getNamedQuery得到hql查询串。外置命名查询将查询语句放到映射文件中,这样在程序中都可以查询使用该字符串。

<hibernate-mapping><class name="com.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/><property name="createTime"/><many-to-one name="classes" column="classesid"/></class><query name="queryStudent"><![CDATA[select s from Student s where s.id <?]]></query>	</hibernate-mapping>

程序中代码:

List students = session.getNamedQuery("queryStudent").setParameter(0, 10).list();for (Iterator iter=students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getName());}


二、查询过滤器

    查询过滤器可以对查询的内容进行过滤,在映射文件中定义过滤器参数,在类的映射文件中使用过滤器参数,在程序中启用过滤器为过滤器参数赋值。下面的例子是使用过滤器,指定id的值小于参数:myid的部分

<hibernate-mapping><class name="com.bjpowernode.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/><property name="createTime"/><many-to-one name="classes" column="classesid"/><filter name="testFilter" condition="id < :myid"></filter></class><filter-def name="testFilter"><filter-param type="integer" name="myid"/></filter-def>
</hibernate-mapping>

程序中代码:

             session.enableFilter("testFilter").setParameter("myid", 10);List students = session.createQuery("from Student").list();for (Iterator iter=students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getName());}

三、分页查询

分页查询在项目中经常会用到,setFirstRestlt()从0开始,setMaxResults():每页显示的记录数。实例如下:

                List students = session.createQuery("from Student").setFirstResult(1).setMaxResults(2).list();for (Iterator iter=students.iterator(); iter.hasNext();) {Student student = (Student)iter.next();System.out.println(student.getName());}

四、对象导航查询

    听到导航我们一定很熟悉,之前做.netITOO的时候我们经常会用到导航属性,如果两个表存在主外键联系,这个表可以直接“.”另一个表就可以读取另一个表的属性名称。

List students = session.createQuery("from Student s where s.classes.name like '%2%'").list();

五、连接查询

  连接查询主要是内连接和外连接,我们SQL语句经常会用到的,其中外连接包括左连接和右连接,

1.内连接

查询的结果是笛卡尔积,如果A是学生,B是班级,那么AB的笛卡尔积就是所有学生可能呆的班级的情况。内连接使用join关键字

List students=session.createQuery("select s.name,c.name from Student s join s.classes c").list();

2.外连接

分为左连接和右连接,左连接强调左面如果左面是学生的话,那么它就把所有的学生都查出来了,即使这个学生不属于任何一个班级也会查询出来。右连接强调右面的,如果右面是班级的话,那么会显示所有的班级,没有学生也出来。下面是左连接例子:

List students = session.createQuery("select c.name, s.name from Student s left join s.classes c").list();


六、统计查询

项目中经常会用到统计数量的需求,这时会用到统计查询,简单示例如下:

String hql = "select c.name, count(s) from Classes c join c.students s group by c.name order by c.name";List students = session.createQuery(hql).list();for (int i=0; i<students.size(); i++) {Object[] obj = (Object[])students.get(i);System.out.println(obj[0] + ", " + obj[1]);}

七、DML风格的操作

Data Manipulate Language(数据操作语言),看下面的例子,如果看这个代码,我们可能才打印出来的是王五,其实不是,还是远来的数据,李四,因为数据库表中更新了,但是缓存没有更新,所以我们一般不建议使用,除非有必须,比如遇到性能问题。

Student student = (Student)session.get(Student.class, 1);//数据库表中更新了,但缓存不更新//所以一般不建议使用,除非有必须,如遇到性能问题session.createQuery("update Student s set s.name=? where s.id<?").setParameter(0, "王五").setParameter(1, 5).executeUpdate();//student = (Student)session.load(Student.class, 1);student = (Student)session.get(Student.class, 1);System.out.println("student.name=" + student.getName());

小结:

      到这里基本的hql语句就总结完了。基本的可能是这样,更多的需要我们在项目实践中综合使用。接下来的博客会继续介绍hibernate,这段时间发现喜欢上了总结。

这篇关于【Hibernate】hql使用总结(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109497

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa