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 ...
随机推荐
- Centos7 守护进程supervisord 安装使用
pervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统.它 ...
- 大龄IT程序员的救赎之道
不知道从什么时候开始,中年危机持续刷屏,遍布整个职场,横跨各个行业,对各个细分工种的中年男女或者即将步入中年的青年男女几乎形成了垂直打击,而且中年这个年龄分界线从40岁滑落到35岁,甚至到30岁.笔者 ...
- 代码审计和动态测试——BUUCTF - 高明的黑客
根据题目提示,访问http://2ea746a2-0ecd-449b-896b-e0fb38956134.node1.buuoj.cn/www.tar.gz下载源码 解压之后发现有3002个php文件 ...
- 【重庆师范大学】PHP博客训练-Thinkphp
设计数据库 CREATE TABLE `user` ( `user_id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar() COM ...
- JVM探究之 —— 垃圾回收(二)
1. 垃圾收集算法 1.1 标记清除(Mark-Sweep)算法 标记—清除算法是第一种使用和比较完善的垃圾回收算法,后续的收集算法都是基于其设计思路并对其不足进行改进而得到的. 该算法分为“标记”和 ...
- SqlComparison
package com.ufo.leftjoin; import java.security.MessageDigest; import java.sql.Connection; import jav ...
- java 把 PEM 格式的公钥证书转换为 X.509 格式的证书
代码: @UtilityClass public final class X509Certs { private static final CertificateFactory CERTIFICATE ...
- springboot vue前后端分离 跨跨域配置
public class CustomCorsFilter extends OncePerRequestFilter { @Override protected void doFilterIntern ...
- continue & tag in GO
Go语言中 continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用,在 continue 语句后添加标签时,表示开始标签对应的循环,例如: package mai ...
- 模态窗口showModalDialog的浏览器兼容解决方案【改】
将代码中原来的 window.showModalDialog 全部替换成: showModalDialogN 然后增加方法: function showModalDialogN(uri, args, ...