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 ...
随机推荐
- Shell字符串截取(非常详细)
假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 1 echo ${var#*//} 其中 var 是变量名,# 号是运算符, ...
- [原创]Android 常用adb命令总结
[原创]Android 常用adb命令总结 1 adb介绍 1.1 adb官方网站及下载 官方网站下载安装:http://adbshell.com/downloads 1.2 adb安装是否成功检查? ...
- Spring注解驱动第三讲--@Filter介绍
上一讲主要针对@ComponentScan注解做了一些说明,本文主要对@Filter的扫描条件,再做一些详细的介绍 1,FilterType.ANNOTATION 按照注解的方式进行扫描.后面clas ...
- Chrome:不受信任的证书----openssl签发带Subject Alternative Name的证书
Chrome下自签名证书提示无效的问题 发现chrome验证证书很严格,必须带有Subject Alternative Name.签发csr时,修改openssl.cnf : vi /etc/ssl/ ...
- Swift5升级遇到的AVCapturexxxDelegate的坑,写法换了
升级到swift5之后,遇到关于AVCapture的两个代理都失效了, 找了一圈,发现原因是代理方法写法变了,如果不替换,代理事件就收不到了 解决方法: 替换新写法就可以了 我这边只举例我遇到的两个例 ...
- Java基础 awt Button 点击按钮后在控制台输出文字
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- flutter 高德地图选择位置信息返回
添加依赖:(注意,作者一直更新维护,请以最新的版本添加) amap_map_fluttify: ^ amap_search_fluttify: ^ 代码实现: import 'package:amap ...
- Linux sed正则匹配删除整行
原文内容: [root@10 tmp]# more test.log 2019-12-01 09:09:02 Failed 2019-12-01 09:12:02 Failed 2019-12-01 ...
- k8s记录-kubeam部署
#配置源[kubernetes] name=kubernetes repo baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kuberne ...
- cordova 的安桌动画
1.cordova 的安桌动画cordova plugin add cordova-plugin-lottie-splashscreenhttps://github.com/timbru31/cord ...