这篇主要简单间接 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());
}

最新文章

  1. 20款风格独特的搜索框 PSD 设计素材免费下载
  2. js兼容方法:获取当前样式|计算后样式 getStyle
  3. 转:视频压缩的基本概念(x264解压包)
  4. c++、c实现推箱子小游戏
  5. HTTP状态码含义
  6. 终于知道如何使Tab控件的不出现白边的方法了
  7. 【原创】java NIO FileChannel 学习笔记 FileChannel 简介
  8. 教你如何解决Sublime Text 3使用中出现的中文乱码问题
  9. zcu102 hdmi example(二)
  10. erlang下lists模块sort(排序)方法源码解析(二)
  11. vo与po
  12. Generate Parentheses leetcode java
  13. angularjs component
  14. 判断String 中文混输 长度
  15. C编程常错项
  16. 有关于mfc webbrowser插件的使用
  17. 13 Reasons Why You Should Pay Attention to Mobile Web Performance
  18. MySQL数据库(9)----从命令行获取元数据
  19. 在 QML 中创建 C++ 导入类型的实例
  20. zen cart 空白页面的解决方案

热门文章

  1. MySQL避免插入重复记录:唯一性约束
  2. cBioPortal 数据库
  3. Mercurial 的hook使用
  4. 深入ES6中的class类
  5. @RequestBody的使用
  6. [Beta阶段]第五次Scrum Meeting
  7. 自顶向下深入分析Netty(三)--Bootstrap
  8. 【转】Android Fastboot 与 Recovery 和刷机
  9. ubuntu16 修改gitlab root密码
  10. ps 渐进式图片的技巧(支持jpg,gif,png)