java之hibernate之hibernate查询
这篇主要简单间接 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查询的更多相关文章
- Java面试题:Hibernate的二级缓存与Hibernate多表查询
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
- hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)
hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate应用SQL查询返回实体类型
Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)
hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...
- Hibernate三大类查询总结
Hibernate目前总共分为三大类查询:cretiria,hql,本地sql [以下篇章搜集于网络,感谢作者] 第一:关于cretiria的查询 具有一个直观的.可扩展的条件查询API是Hibern ...
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
在Hibernate中如果通过 [java] view plaincopy session.createSQLQuery("select '合计' as name from dual&quo ...
- 使用hibernate原生sql查询,结果集全为1的问题解决
问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Ob ...
随机推荐
- saltstack自动化运维工具搭建个人笔记
至于为什么选择saltstack,因为Puppet.Chef基于Ruby开发,而ansible.saltstack基于python开发,便于后期二次,良好的可移植性. 又,ansible基于SSH协议 ...
- 是什么让我走上Java之路?
选择方向,很多人都为根据自己的兴趣爱好和自己的能力所长而作出选择.那么是什么让我走上Java之路? 整个高三我有两门课程没有听过课,一门是数学,一门是物理.当时候物理没有听课的原因很简单,我有一本&l ...
- ELK(Elasticsearch + Logstash + Kibana) 日志收集
单体应用或微服务的场景下,每个服务部署在不同的服务器上,需要对日志进行集重收集,然后统一查看所以日志. ELK日志收集流程: 1.微服务器上部署Logstash,对日志文件进行数据采集,将采集到的数据 ...
- 第08组 Beta冲刺(3/4)
队名 八组评分了吗 组长博客链接(2分) 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 了解各个小组的进度与难以攻破的地方,晚上安排开会,安排新的冲刺任务. 重新分配小组及个人任务. ...
- js去除html标签样式
params = params.replace(/<\/?.+?>/g,"").replace(/ /g,"");
- 投稿SCI杂志 | 如何撰写cover letter | 如何绘制illustrated abstract
现在大部分学术期刊杂志都要求提供这两样东西. 一个是面向editor的文章和研究的高度总结:一个是面向读者的高度总结,一图胜千言. 如何制作动画摘要呢? 收集素材,大部分内容在PPT里就能完成. 如何 ...
- 【python基础学习】基础重点难点知识汇总
python中decorator装饰器 语法示例: @decorator 什么是装饰器: 问题: 定义一个函数后 在运行时动态增加功能 又不想改动函数本身的代码 示例: # 希望对下列函数调用增加lo ...
- 【spring源码学习】spring事务中的嵌套事务中的保存点相关知识
JDBC事务保存点(setSavepoint, releaseSavepoint )实例 以下是使用事务教程中描述的setSavepoint和回滚的代码示例. 此示例代码是基于前面章节中完成的环境和数 ...
- easyui datagrid合并相同数据的单元格。
/** * 根据作用域填充单元格 */ function mergeCellsByField(tableID, colList) { var ColArray = colList.split(&quo ...
- 统计git提交代码量
# a新增行数,d删除行数 git log --author="`git config --get user.name`" --pretty="%H" --a ...