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有七种映射 ...
随机推荐
- .Net 两个对像之间的映射 ( 二 )
一.使用 class Program { static void Main(string[] args) { User u1 = new User(); u1.UserName = "aaa ...
- 20155206 实验一《Java开发环境的熟悉》实验报告
实验内容 使用JDK编译.运行简单的Java程序 使用IDEA 编辑.编译.运行.调试Java程序. 实验代码 `import java.text.DecimalFormat; import java ...
- 2017-2018-1 20155308&20155321&20155330《信息安全技术》实验三——数字证书应用1
2017-2018-1 20155308&20155321&20155330<信息安全技术>实验三--数字证书应用1 实验目的 了解PKI体系 了解用户进行证书申请和CA颁 ...
- 20155319《Java程序设计》实验三(敏捷开发与XP实践)实验报告
20155319<Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 (一)使用Code菜单 在IDEA中使用工具(Code->Reformate Code) ...
- primary key和unique的区别
定义了 UNIQUE 约束的字段中不能包含重复值,可以为一个或多个字段定义 UNIQUE 约束.因此,UNIQUE 即可以在字段级也可以在表级定义, 在 UNIQUED 约束的字段上可以包含空值.OR ...
- tkinter界面卡死的解决办法
0.如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死 import tkinter as tk import time def onclick(text, i): time.sleep(3) t ...
- 请求头(request headers)和响应头(response headers)解析
*****************请求头(request headers)***************** POST /user/signin HTTP/1.1 --请求方式 文件名 http ...
- 【LG3231】[HNOI2013]消毒
题面 洛谷 题解 代码 \(100pts\) #include<iostream> #include<cstdio> #include<cstdlib> #incl ...
- Drupal7重置密码方法
Drupal版本 7.40 方法1: 根目录index.php添加 require_once 'includes/password.inc'; require_once 'includes/boots ...
- 创龙6748开发板加载.out出现a data verification error occurred, file load failed
1. 需要提前添加GEL文件 2. 找到GEL文件路径 3. 然后再加载.out文件