这篇主要简单间接 hibernate查询

1.数据库操作中最重要的是查询,Hibernate提供了多种查询方式来帮助程序员快速实现查询功能。

有hql,本地sql查询,Criteria查询,example, oid等。

2.Hql 查询:
Hql :hibernate query language,Hiberante查询语言。这是一种面向对象的查询语言,和 sql 语句非常相似,对于查询关键字不区分大小写,其他的都区分大小写。

3.测试

public class HibernateTest {
Session session =null;
//在每次执行测试方法前,先执行一次
@Before
public void before(){
session = HibernateUtil.getSession();
}
//每次执行测试方法后,执行一次
@After
public void after(){
HibernateUtil.close();
}
//查询所有
@Test
public void testFindAll(){
//编写hql语句 Book是类名 区分大小写,相当于select * from t_book;
String hql="from Book";
List<Book> list = session.createQuery(hql).list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//条件查询
@Test
public void testCondition(){
//可以在类名 后设置别名,如果设置了别名就得使用
String hql="from Book b where b.price>40";
List<Book> list = session.createQuery(hql).list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//传参
@Test
public void testParam(){
//可以在类名 后设置别名,如果设置了别名就得使用
String hql="from Book b where b.price>?";
List<Book> list = session.createQuery(hql)
.setDouble(, )//为占位符设置参数
.list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//参数通过命名查询
@Test
public void testNameParam(){
//命名前 加冒号
String hql="from Book b where b.price>:price";
List<Book> list = session.createQuery(hql)
.setDouble("price", )//为占位符设置参数
.list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//模糊查询
@Test
public void testLike(){
String hql="from Book b where b.name like :name";
List<Book> list = session.createQuery(hql)
.setString("name", "水%")//为占位符设置参数
.list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//查询指定列的数据
@Test
public void testColumn(){
String hql="select b.name,b.author from Book b";
List<Object[]> list = session.createQuery(hql).list();
for(Object[] temp:list){
System.out.println(temp[]+"---"+temp[]);
}
}
//将查询指定列的数据封装为对象
@Test
public void testColumnObject(){
String hql="select new Book(b.name,b.author) from Book b";
List<Book> list = session.createQuery(hql).list();
for(Book b:list){
System.out.println(b.getName()+"---"+b.getAuthor());
}
}
//聚合函数查询
@Test
public void testCount(){
String hql="select count(id) from Book";
List list=session.createQuery(hql).list();
System.out.println(list.get());
}
//返回唯一值 uniqueResult返回值 只有一个值
@Test
public void testCount1(){
String hql="select count(id) from Book";
long result=(Long)session.createQuery(hql).uniqueResult();
System.out.println(result);
}
//查询单个对象也可以使用uniqueResult
@Test
public void testUniqueObject(){
String hql="from Book b where b.id=1";
Book b = (Book)session.createQuery(hql).uniqueResult();
System.out.println(b.getName()+"---"+b.getAuthor());
}
//分页查询
@Test
public void testPage(){
//当前页 currentPage
//每页显示记录数 pageSize
List<Book> list = session.createQuery("from Book")
//(currentPage-1)*pageSize
.setFirstResult()
//pageSize
.setMaxResults()
.list();
for(Book b:list){
System.out.println(b.getName()+"---"+b.getAuthor());
}
}
//in子查询
@Test
public void testIn(){
String hql="from Book b where b.id in(:ids)";
List<Book> list = session.createQuery(hql)
.setParameterList("ids", new Integer[]{,,})
.list();
for(Book b:list){
System.out.println(b.getId()+"---"+b.getName()+"---"+b.getAuthor());
}
}
//排序
@Test
public void testOrder(){
String hql="from Book b where b.id in(:ids) order by b.id desc";
List<Book> list = session.createQuery(hql)
.setParameterList("ids", new Integer[]{,,})
.list();
for(Book b:list){
System.out.println(b.getId()+"---"+b.getName()+"---"+b.getAuthor());
}
}
//分组查询 按书籍分类查询每个组的书的数量
//查询列 必须是分组列或聚合列
@Test
public void testGroup(){
String hql="select count(*),b.category.name from Book b group by b.category.name";
List<Object[]> list = session.createQuery(hql).list();
for(Object[] temp:list){
System.out.println(temp[]+"----"+temp[]);
}
}
//连接查询
@Test
public void testInner(){
//String hql="select b.name,b.category.name,b.author from Book b";
String hql="select b.name,b.category.name,b.author from Book b inner join b.category";
List<Object[]> list = session.createQuery(hql).list();
for(Object[] temp:list){
System.out.println(temp[]+"----"+temp[]+"----"+temp[]);
}
}
//命名查询
/**
*在映射文件中配置好 如下命名查询
<!-- hql命名查询 名称在整个项目唯一 -->
<query name="findAll">
from Book;
</query>
*/
@Test
public void testNamedQuery(){
List<Book> list = session.getNamedQuery("findAll").list();
for(Book b:list){
System.out.println(b.getName()+"--"+b.getAuthor());
}
}
}

4.本地 sql 查询: hibernate支持使用 sql 来查询;因为 hql 语句不能针对特定数据库功能来实现。

public class SqlTest {
Session session =null;
//在每次执行测试方法前,先执行一次
@Before
public void before(){
session = HibernateUtil.getSession();
}
//每次执行测试方法后,执行一次
@After
public void after(){
HibernateUtil.close();
}
//查询所有
@Test
public void testFindAll(){
String sql="select * from t_book";
List<Object[]> list =session.createSQLQuery(sql).list();
for(Object[] temp:list){
System.out.println(temp[0]+"---"+temp[1]+"---"+temp[2]);
}
}
//将查询的数据进行封装为对象
@Test
public void testObject(){
String sql="select * from t_book";
List<Book> list = session.createSQLQuery(sql).addEntity(Book.class).list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//本地命名查询
@Test
public void testNamedQuery(){
Object[] temp= (Object[])session.getNamedQuery("findBookById").uniqueResult();
System.out.println(temp[0]+"---"+temp[1]);
}
//设置参数
@Test
public void testParam(){
String sql="select * from t_book where price>?";
List<Book> list = session.createSQLQuery(sql).addEntity(Book.class)
.setDouble(0, 40)
.list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//设置参数名称
@Test
public void testParamName(){
String sql="select * from t_book where price>:price";
List<Book> list = session.createSQLQuery(sql).addEntity(Book.class)
.setDouble("price", 40)
.list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
//分页
@Test
public void testPage(){
String sql="select * from t_book";
List<Book> list = session.createSQLQuery(sql).addEntity(Book.class)
.setFirstResult(0)
.setMaxResults(2)
.list();
for(Book b:list){
System.out.println(b.getName()+"----"+b.getAuthor());
}
}
}

5. Criteria 查询:使用对象的方式进行查询

public class CriteriaTest {
Session session =null;
//在每次执行测试方法前,先执行一次
@Before
public void before(){
session = HibernateUtil.getSession();
}
//每次执行测试方法后,执行一次
@After
public void after(){
HibernateUtil.close();
}
//查询所有
@Test
public void testFindAll(){
List<Book> list =session.createCriteria(Book.class).list();
printListbook(list);
}
private void printListbook(List<Book> list) {
for(Book b:list){
System.out.println(b.getName()+"---"+b.getAuthor());
}
}
//条件查询 使用Restrictions类的静态方法 添加各种条件
@Test
public void testCondition(){
List<Book> list =session.createCriteria(Book.class)
//通过add添加条件
.add(Restrictions.ge("price", 40d))
.list();
printListbook(list);
}
//多个条件and查询 价格大于20 并且 作者是sun
@Test
public void testMultiConditionAnd(){
List<Book> list =session.createCriteria(Book.class)
//通过add添加条件
.add(Restrictions.ge("price", 20d))
.add(Restrictions.eq("author", "sun"))
.list();
printListbook(list);
}
@Test
public void testMultiConditionAnd1(){
List<Book> list =session.createCriteria(Book.class)
//通过add添加条件
.add(Restrictions.and(Restrictions.ge("price", 20d), Restrictions.eq("author", "sun"))) .list();
printListbook(list);
}
//多条件or查询 价格大于20 或者 作者是sun
@Test
public void testMultiConditionOr(){
List<Book> list =session.createCriteria(Book.class)
//通过add添加条件
.add(Restrictions.or(Restrictions.ge("price", 20d), Restrictions.eq("author", "sun")))
.list();
printListbook(list);
}
//or 和 and 查询 查询价格大于20 作者是sun 或者价格大于40的书籍信息
@Test
public void testAndOr(){
List<Book> list =session.createCriteria(Book.class)
//通过add添加条件
.add(Restrictions.or(Restrictions.ge("price", 40d),
Restrictions.and(Restrictions.eq("author", "sun"),
Restrictions.ge("price", 20d))))
.list();
printListbook(list);
}
//排序
@Test
public void testOrder(){
List<Book> list = session.createCriteria(Book.class)
.addOrder(Order.asc("price"))
.list();
printListbook(list);
}
//分页
@Test
public void testPage(){
List<Book> list = session.createCriteria(Book.class)
.setFirstResult(0)
.setMaxResults(2)
.list();
printListbook(list);
}
//聚合查询 使用Projections来完成
@Test
public void testCount(){
Long result = (Long)session.createCriteria(Book.class)
.setProjection(Projections.countDistinct("id"))
.uniqueResult();
System.out.println(result);
}
}

6.过滤查询

a).定义过滤器---在hibernate-mapping中定义

<!-- 过滤器定义 -->
<filter-def name="idFilter">
<filter-param name="idParam" type="int"/>
</filter-def>

b). 引用过滤器---在class标签中引用

<class name="Book" table="t_book">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="author"/>
<property name="price"/>
<property name="pubDate"/>
<!-- 多对一的关联关系设置 column指定外键的名称 -->
<many-to-one name="category" column="cid" fetch="join"/>
<filter name="idFilter" condition=":idParam=id"></filter>
</class>

c). 查询时使用

@Test
public void testFilter(){
session.enableFilter("idFilter")//启动过滤器
.setParameter("idParam", 1);//设置过滤参数
Book b=(Book)session.createQuery("from Book").uniqueResult();
System.out.println(b.getName()+"---"+b.getAuthor());
}

java之hibernate之hibernate查询的更多相关文章

  1. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  2. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  3. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  4. hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)

    hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...

  5. Hibernate之HQL查询

    一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...

  6. Hibernate应用SQL查询返回实体类型

    Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...

  7. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

    hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...

  8. Hibernate三大类查询总结

    Hibernate目前总共分为三大类查询:cretiria,hql,本地sql [以下篇章搜集于网络,感谢作者] 第一:关于cretiria的查询 具有一个直观的.可扩展的条件查询API是Hibern ...

  9. Hibernate通过SQL查询常量时只能返回第一个字符的解决方法

    在Hibernate中如果通过 [java] view plaincopy session.createSQLQuery("select '合计' as name from dual&quo ...

  10. 使用hibernate原生sql查询,结果集全为1的问题解决

    问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Ob ...

随机推荐

  1. 数据库MySQL调优实战经验总结<转>

    数据库MySQL调优实战经验总结 MySQL 数据库的使用是非常的广泛,稳定性和安全性也非常好,经历了无数大小公司的验证.仅能够安装使用是远远不够的,MySQL 在使用中需要进行不断的调整参数或优化设 ...

  2. 运行虚拟机报错:CPU acceleration status: HAXM is not installed on this machine

    运行虚拟机报错:CPU acceleration status: HAXM is not installed on this machine. 这是因为SDKmanage没有安装HAXM ,于是打开S ...

  3. Excel 截取字符,判断县区 城市。

    https://jingyan.baidu.com/article/624e7459aa90e434e8ba5a8a.html https://jingyan.baidu.com/article/9f ...

  4. zabbix 同步ldap帐号脚本

    1.界面配置ldap验证(略) 2.mysql导入ldap帐号信息 #!/usr/bin/env python# -*- coding:utf-8 -*- import pymysqlimport c ...

  5. Tomcat 9 管理界面配置

    Tomcat9 在conf/tomcat_user.xml配置后,还是出现如下错误 然后修改tomcat9/webapps/manager/META-INF的context.xml文件

  6. android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件

    //android Studio  keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件 遇到这个问题好久了,一直没解决今天搜集了大量的资料,有的说什么Java没配置好,不是扯犊子吗 ...

  7. Jackson的基本用法与拓展

    目录 一.先搞两个测试需要使用的类 二.简单操作:obj与json互转 2.1.对象转json字符串 2.2.json字符串转对象 三.拓展需求 3.1.对象转json时,忽略某个字段 3.2.对象转 ...

  8. k8s记录-Dockerfile详解

    Dockerfile命令详解 下面我们来分别介绍下上面使用到的命令: FROM 格式:FROM 或FROM :. 解释:FROM必须是Dockerfile里的第一条指令(注视除外),后面跟有效的镜像名 ...

  9. ZXing生成二维码、读取二维码

    使用谷歌的开源包ZXing maven引入如下两个包即可 <dependency>   <groupId>com.google.zxing</groupId>  & ...

  10. oracle 统计成绩

    set serveroutput on; declare cursor c1 is select dno,dname from dep; pdno dep.dno%TYPE; pdname dep.d ...