Hibernate(七)
三套查询之HQL查询(原文再续书接上一回)
where子句部分(查询过滤部分)
Hibernate的where子句部分能支持的运算符,表达式、函数特别多,用法与sql语句是一样的.
常用的表达式、运算符、函数:
=、<、<=、>、>=、!=、and、or、distinct、between...and 、like、concat()、
is null, is not null, is empty, is not empty、second(...),
minute(...), hour(...), day(...), month(...)。
支持EJB-QL 3.0的函数:
trim(), lower(), upper(), length(), abs(), sqrt(), bit_length(), mod()
支持操作集合属性的函数:
size()|size, minelement(), maxelement(), minindex(), maxindex().
1.支持自定义的索引号
//支持自定义的索引号
@Test
public void test5(){
Query query = session.createQuery("select s from Student s where s.name like ?57");
query.setParameter("57", "%ab%");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
2.like
//like
@Test
public void test6(){
Query query = session.createQuery("select s from Student s where s.name like ?3");
query.setParameter("3", "%k%");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
3.between and
//between and
@Test
public void test7(){
Query query = session.createQuery("select s from Student s where s.name like ?3 and s.java between ?4 and ?5");
query.setParameter("3", "%k%").setParameter("4", 10).setParameter("5", 80);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getJava()+student.getTeacher().getTname());
}
}
4.concat
//concat
@Test
public void test8(){
Query query = session.createQuery("select s from Student s where s.name like concat('%',?,'%')");
query.setParameter(0, "ab");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
5.is not null
//is not null
@Test
public void test9(){
Query query = session.createQuery("select s from Student s where s.name is not null");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
6.trim
//trim
@Test
public void test10(){
Query query = session.createQuery("select s from Student s where trim(s.name) like ?");
query.setParameter(0, "aa%");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
7.upper
//upper
@Test
public void test11(){
Query query = session.createQuery("select upper(s.name) from Student s where s.name like ?");
query.setParameter(0, "%b%");
List<String> list = query.list();
for (String string : list) {
System.out.println(string);
}
}
8.length
//length
@Test
public void test12(){
Query query = session.createQuery("select s from Student s where length(s.name)>? ");
query.setParameter(0, 4);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
9.sqrt
//sqrt
@Test
public void test13(){
Query query = session.createQuery("select s from Student s where sqrt(s.id)=?");
query.setParameter(0, 2.0);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
10.bit_length
//bit_length 位长度
@Test
public void test14(){
Query query = session.createQuery("select bit_length(s.name) from Student s where s.id=?57");
query.setParameter("57", 3);
Long uniqueResult = (Long) query.uniqueResult();
System.out.println(uniqueResult);
}
11.mod
//mod
@Test
public void test15(){//选取id为偶数的学生
Query query = session.createQuery("select s from Student s where mod(s.id,?)=?");
query.setParameter(0, 2);
query.setParameter(1, 0);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
}
12.size
操作集合属性的函数
//size
@Test
public void test16(){
Query query = session.createQuery("select t from Teacher t where size(t.students)>?");
query.setParameter(0, 50);
List<Teacher> list = query.list();
for (Teacher teacher : list) {
System.out.println(teacher.getTid()+teacher.getTname());
}
System.out.println("======================================");
Query query1 = session.createQuery("select t from Teacher t where t.students.size>?");
query1.setParameter(0, 30);
List<Teacher> list1 = query1.list();
for (Teacher teacher : list1) {
System.out.println(teacher.getTid()+teacher.getTname());
}
}
13.minelement(), maxelement()
对集合中元素生成的列进行操作
//minelement(), maxelement() 返回集合中的元素主键最大/最小的元素
@Test
public void test17(){
Query query = session.createQuery("select maxelement(t.students) from Teacher t");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+":"+student.getName()+":"+student.getJava());
}
System.out.println("===============================");
Query query1 = session.createQuery("select minelement(t.students) from Teacher t");
List<Student> list1 = query1.list();
for (Student student : list1) {
System.out.println(student.getId()+":"+student.getName()+":"+student.getJava());
}
}
14.minindex(), maxindex()
对集合中的排序列进行操作。
对于索引了(有序)的集合,可以使用minindex
与 maxindex
函数来引用到最小与最大的索引序数。
同理,可以使用minelement
与 maxelement
函数来 引用到一个基本数据类型的集合中最小与最大的元素。(如上)
List<Order> orders = session.createQuery("select o from Order o where minindex(o.orderItems) = ?").setParameter(0,0).list(); List<Order> orders = session.createQuery("select o from Order o where maxindex(o.orderItems) = ?").setParameter(0,0).list();
子查询
Hibernate的子查询与SQL语句中的子查询一样,子查询部分放在in、not in里面.
//把老师的id和学生的id一样的学生查询出来
@Test
public void test19(){
Query query = session.createQuery("select s from Student s where s.id in (select t.tid from Teacher t)");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
多态查询
当持久化类存在继承关系时,查询父类时,它会把父类所有的对象查询出来,而且也会把所有子类对象查询出来。
//查询所有
@Test
public void test20(){
//Query query = session.createQuery("select o from java.lang.Object o");
Query query = session.createQuery("from java.lang.Object");
List list = query.list();
System.out.println(list.size());
}
命名查询
把所有hql语句写在一个单独的配置文件中.
一般在实际的项目中用得比较多,它会把比较复杂的hql语句写在一个单独的配置文件中,
方便以后对hql语句进行优化,也方便统一管理.
1.第一种方式*.hbm.xml
A.创建Query.hbm.xml
在官方下载的项目里搜索*.hbm.xml,拷贝一个文件到自己的项目里,修改文件名(任意),修改文件内容:
<!-- 定义HQL查询语句 -->
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<query name="hql_student_xml">from Student</query>
</hibernate-mapping>
B.配置到 hibernate.cfg.xml
C.代码使用
@Test
public void test21(){
Query query = session.getNamedQuery("hql_student_xml");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
}
2.第二种方式在持久类上加注解
package com.rong.entity.group; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery; @Entity
//配置多个命名查询hql语句
@NamedQueries(value={@NamedQuery(name="query1",query="select s from Student s where s.name like ?")
,@NamedQuery(name = "query2", query = "from Student")})
//只能配置单个命名查询hql语句,一个类中该注解只能使用一次!
@NamedQuery(name = "query3", query = "select count(s) from Student s")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private int math;
private int java;
@ManyToOne(targetEntity=Teacher.class,fetch=FetchType.LAZY)
@JoinColumn(name="t_id",referencedColumnName="tid")
private Teacher teacher;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
@Test
public void test22(){
Query query1 = session.getNamedQuery("query1");
query1.setParameter(0, "%ab%");
List<Student> list1 = query1.list();
for (Student student : list1) {
System.out.println(student.getId()+student.getName());
} Query query2 = session.getNamedQuery("query2");
List<Student> list2 = query2.list();
for (Student student : list2) {
System.out.println(student.getId()+student.getName());
} Query query3 = session.getNamedQuery("query3");
Object uniqueResult = query3.uniqueResult();
System.out.println(uniqueResult);
}
Hibernate(七)的更多相关文章
- Hibernate(七)一对一映射
一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...
- hibernate(七) hibernate中查询方式详解
序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...
- Hibernate(七)__多对一 、一对多、 一对一、多对多
1.many-to-one 以学生和部门之间的关系为例: Department.hbm.xml <?xml version="1.0" encoding="utf- ...
- 2、hibernate七步走完成增删改查
一.hibernate框架介绍如下 1.框架=模板 2.Hibernate是对象模型与关系数据库模型之间的桥梁 3.hibernate持久化概念 什么是ORM ORM是对象关系映射,是一种数据持久化操 ...
- Java之旅hibernate(8)——基本关系映射
何为关系,何为映射,关系这个词想必大家都不陌生.比方你和老师之间是师生关系,你和父母之间是父子或者父女(母子或者母女关系). 关系是存在某种联系物体之间产生的.什么都是可能的.比方你和工具,你仅仅能使 ...
- Hibernate映射解析——七种映射关系
首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对 ...
- SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系
ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据 ...
- SSH:Hibernate框架(七种关联关系映射及配置详解)
概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...
- Hibernate的七种映射关系之七种关联映射(二)
继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.pri ...
- Hibernate的七种映射关系之基本映射
说到关系,在这个世界无处不在,我们必须以某个关系的节点存在在这个世界网中.比如父子关系,师生关系,上下属关系甚至是危险关系.数据也是一样的,它的存在必为某其他节点做准备. Hibernate有七种映射 ...
随机推荐
- leetcode记录-两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- Docker学习笔记-Windows系统支持(一)
Docker对windows的支持情况: 一.Docker for Windows ServerDocker Enterprise Edition for Windows Server 2016htt ...
- Linux入门第五天——shell脚本入门(下)基础语法之调试debug
一.如何debug 1.通过sh命令的参数: sh [-nvx] scripts.sh 选项与参数: -n :不要执行 script,仅查询语法的问题: -v :再执行 sccript 前,先将 sc ...
- wmware 10 升级到11后,macos不能运行的问题
解决方案: 1.由于wmware升级,原来的unlocker已不能使用. 所以得升级unlocker版本,目前支持wmware11的最新版本是2.0.4 http://www.insanelymac. ...
- 安装支持elasticsearch使用sql查询插件
一.ElasticSearch-SQL介绍 ElasticSearch-SQL(后续简称es-sql)是ElasticSearch的一个插件,提供了es 的类sql查询的相关接口.支持绝大多数的sql ...
- 理解依赖注入(Dependency Injection)
理解依赖注入 Yii2.0 使用了依赖注入的思想.正是使用这种模式,使得Yii2异常灵活和强大.千万不要以为这是很玄乎的东西,看完下面的两个例子就懂了. class SessionStorage { ...
- 搭建 ssm 环境
<!-- 引入外部jdbc配置文件 --> <context:property-placeholder location="classpath:dbconfig.prope ...
- angularjs 路由机制
前言 AngularJS路由主要有内置的ngRoute和一个基于ngRoute开发的第三方路由模块ui-router,内置的ngRoute有时满足开发需求,使用ui-router可以解决很多原生ngR ...
- JQuery事件机制
1 事件操作 1.1 页面载入事件 $(document).ready(function(){ // 在这里写你的代码... }); 或者 $(function($) { // 你可以在这里继续使用$ ...
- 我们一起学习WCF 第一篇初识WCF(附源码供对照学习)
前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wc ...