Hibernate 之QBC

article/2025/11/7 20:47:19
一、Hibernate 中聚合函数的使用
Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能:
List cats = session.createCriteria(Cat. class )
               .setProjection(Projections.projectionList()
               .add(Projections.rowCount())
               .add(Projections.avg(
" weight " ))
               .add(Projections.max(
" weight " ))
               .add(Projections.min(
" weight " ))
               .add(Projections.groupProperty(
" color " ))
           ).addOrder(Order.asc(
" color " )).list();

示例代码相当于:
select color,count(*),avg(weight),max(weight),min(weight),min(weight) from cat group by color ordy color asc;
二、条件查询(Criteria Queries)
具有一个直观的、可扩展的条件查询API是Hibernate的特色。
1. 创建一个Criteria 实例
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. 限制结果集内容
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。
List cats  =  sess.createCriteria(Cat. class )
    .add( Restrictions.like(
" name " " Fritz% " ) )
    .add( Restrictions.between(
" weight " , minWeight, maxWeight) )
    .list();

约束可以按逻辑分组。
List cats  =  sess.createCriteria(Cat. class )
    .add( Restrictions.like(
" name " " Fritz% " ) )
    .add( Restrictions.or(
        Restrictions.eq( 
" age " new  Integer( 0 ) ),
        Restrictions.isNull(
" age " )
    ) )
    .list();


List cats  =  sess.createCriteria(Cat. class )
    .add( Restrictions.in( 
" name " new  String[]  "Fritz""Izi""Pk" }  ) )
    .add( Restrictions.disjunction()
        .add( Restrictions.isNull(
" age " ) )
        .add( Restrictions.eq(
" age " new  Integer( 0 ) ) )
        .add( Restrictions.eq(
" age " new  Integer( 1 ) ) )
        .add( Restrictions.eq(
" age " new  Integer( 2 ) ) )
    ) )
    .list();

Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。
List cats  =  sess.createCriteria(Cat. class )
    .add( Restrictions.sql(
" lower({alias}.name) like lower(?) " " Fritz% " , Hibernate.STRING) )
    .list();

{alias}占位符应当被替换为被查询实体的列别名。
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。
Property age  =  Property.forName( " age " );
List cats 
=  sess.createCriteria(Cat. class )
    .add( Restrictions.disjunction()
        .add( age.isNull() )
        .add( age.eq( 
new  Integer( 0 ) ) )
        .add( age.eq( 
new  Integer( 1 ) ) )
        .add( age.eq( 
new  Integer( 2 ) ) )
    ) )
    .add( Property.forName(
" name " ).in(  new  String[]  "Fritz""Izi""Pk" }  ) )
    .list();

3. 结果集排序
你可以使用org.hibernate.criterion.Order来为查询结果排序。
List cats  =  sess.createCriteria(Cat. class )
    .add( Restrictions.like(
" name " " F% " )
    .addOrder( Order.asc(
" name " ) )
    .addOrder( Order.desc(
" age " ) )
    .setMaxResults(
50 )
    .list();
 


List cats  =  sess.createCriteria(Cat. class )
    .add( Property.forName(
" name " ).like( " F% " ) )
    .addOrder( Property.forName(
" name " ).asc() )
    .addOrder( Property.forName(
" age " ).desc() )
    .setMaxResults(
50 )
    .list();
 
4. 关联
你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。
List cats  =  sess.createCriteria(Cat. class )
    .add( Restrictions.like(
" name " " F% " )
    .createCriteria(
" kittens " )
        .add( Restrictions.like(
" name " " F% " )
    .list();
 

注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。
接下来,替换形态在某些情况下也是很有用的。
List cats  =  sess.createCriteria(Cat. class )
    .createAlias(
" kittens " " kt " )
    .createAlias(
" mate " " mt " )
    .add( Restrictions.eqProperty(
" kt.name " " mt.name " ) )
    .list();

(createAlias()并不创建一个新的 Criteria实例。)
Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。
List cats  =  sess.createCriteria(Cat. class )
    .createCriteria(
" kittens " " kt " )
        .add( Restrictions.eq(
" name " " F% " ) )
    .returnMaps()
    .list();
Iterator iter 
=  cats.iterator();
while  ( iter.hasNext() )  {
    Map map 
= (Map) iter.next();
    Cat cat 
= (Cat) map.get(Criteria.ROOT_ALIAS);
    Cat kitten 
= (Cat) map.get("kt");
}

 

5. 动态关联抓取
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。
List cats  =  sess.createCriteria(Cat. class )
    .add( Restrictions.like(
" name " " Fritz% " ) )
    .setFetchMode(
" mate " , FetchMode.EAGER)
    .setFetchMode(
" kittens " , FetchMode.EAGER)
    .list();

这个查询可以通过外连接抓取mate和kittens。 查看第 20.1 节 “ 抓取策略(Fetching strategies) ”可以获得更多信息。
6. 查询示例
org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list();
版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。
你可以自行调整Example使之更实用。
Example example  =  Example.create(cat)
    .excludeZeroes()           
// exclude zero valued properties
    .excludeProperty( " color " // exclude the property named "color"
    .ignoreCase()               // perform case insensitive string comparisons
    .enableLike();              // use like for string comparisons
List results  =  session.createCriteria(Cat. class )
    .add(example)
    .list();

你甚至可以使用examples在关联对象上放置条件。
List results  =  session.createCriteria(Cat. class )
    .add( Example.create(cat) )
    .createCriteria(
" mate " )
        .add( Example.create( cat.getMate() ) )
    .list();

7. 投影(Projections)、聚合(aggregation)和分组(grouping)
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。
List results  =  session.createCriteria(Cat. class )
    .setProjection( Projections.rowCount() )
    .add( Restrictions.eq(
" color " , Color.BLACK) )
    .list();
List results  =  session.createCriteria(Cat. class )
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount() )
        .add( Projections.avg(
" weight " ) )
        .add( Projections.max(
" weight " ) )
        .add( Projections.groupProperty(
" color " ) )
    )
    .list();

在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。
你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式:
List results  =  session.createCriteria(Cat. class )
    .setProjection( Projections.alias( Projections.groupProperty(
" color " ),  " colr "  ) )
    .addOrder( Order.asc(
" colr " ) )
    .list();


List results  =  session.createCriteria(Cat. class )
    .setProjection( Projections.groupProperty(
" color " ).as( " colr " ) )
    .addOrder( Order.asc(
" colr " ) )
    .list();
 
alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:
List results  =  session.createCriteria(Cat. class )
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount(), 
" catCountByColor "  )
        .add( Projections.avg(
" weight " ),  " avgWeight "  )
        .add( Projections.max(
" weight " ),  " maxWeight "  )
        .add( Projections.groupProperty(
" color " ),  " color "  )
    )
    .addOrder( Order.desc(
" catCountByColor " ) )
    .addOrder( Order.desc(
" avgWeight " ) )
    .list();
 
List results 
=  session.createCriteria(Domestic. class " cat " )
    .createAlias(
" kittens " " kit " )
    .setProjection( Projections.projectionList()
        .add( Projections.property(
" cat.name " ),  " catName "  )
        .add( Projections.property(
" kit.name " ),  " kitName "  )
    )
    .addOrder( Order.asc(
" catName " ) )
    .addOrder( Order.asc(
" kitName " ) )
    .list();

你也可以使用Property.forName()来表示投影:
List results  =  session.createCriteria(Cat. class )
    .setProjection( Property.forName(
" name " ) )
    .add( Property.forName(
" color " ).eq(Color.BLACK) )
    .list();
 
List results 
=  session.createCriteria(Cat. class )
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount().as(
" catCountByColor " ) )
        .add( Property.forName(
" weight " ).avg().as( " avgWeight " ) )
        .add( Property.forName(
" weight " ).max().as( " maxWeight " ) )
        .add( Property.forName(
" color " ).group().as( " color "  )
    )
    .addOrder( Order.desc(
" catCountByColor " ) )
    .addOrder( Order.desc(
" avgWeight " ) )
    .list();
 

8. 离线(detached)查询和子查询
DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。
DetachedCriteria query  =  DetachedCriteria.forClass(Cat. class )
    .add( Property.forName(
" sex " ).eq( ' F ' ) );
  
Session session 
=  .;
Transaction txn 
=  session.beginTransaction();
List results 
=  query.getExecutableCriteria(session).setMaxResults( 100 ).list();
txn.commit();
session.close();

DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。 
DetachedCriteria avgWeight  =  DetachedCriteria.forClass(Cat. class )
    .setProjection( Property.forName(
" weight " ).avg() );
session.createCriteria(Cat.
class )
    .add( Property.forName(
" weight).gt(avgWeight) )
    .list();
 
DetachedCriteria weights 
=  DetachedCriteria.forClass(Cat. class )
    .setProjection( Property.forName(
" weight " ) );
session.createCriteria(Cat.
class )
    .add( Subqueries.geAll(
" weight " , weights) )
    .list();

甚至相互关联的子查询也是有可能的:
DetachedCriteria avgWeightForSex  =  DetachedCriteria.forClass(Cat. class " cat2 " )
    .setProjection( Property.forName(
" weight " ).avg() )
    .add( Property.forName(
" cat2.sex " ).eqProperty( " cat.sex " ) );
session.createCriteria(Cat.
class " cat " )
    .add( Property.forName(
" weight).gt(avgWeightForSex) )
    .list();
 

http://chatgpt.dhexx.cn/article/kPcrflm5.shtml

相关文章

Qt6 中如何使用 qsb

【写在前面】 Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出,市场发生了巨大变化。现在,Qt 6 加入了大量不同平台的图形 API,以确保用户可以在所有平台上以最高性能运行 Qt。 在 Qt Q…

MyBatis十:逆向工程(QBC风格)

逆向工程 一、创建逆向工程 创建依赖pom.xml <packaging>jar</packaging><!-- 依赖MyBatis核心包 --> <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5…

QBC 查询

当使用 hibernate 的 QBC 进行查询的时候&#xff0c;无需写 sql 语句&#xff0c;使用的是 Criteria 对象中的方法进行的实现&#xff0c;创建 Criteria 对象的时候&#xff0c;需要传入一个实体类.class&#xff0c;会自动关联该实体类对应的数据库表。 一&#xff1a;查询所…

Hibernate--QBC举例+详解(一)

QBC检索 QBC&#xff08;Query By Criteria&#xff09;是Hibernate提供的另一种检索对象的方式&#xff0c;它主要由Criteria接口、Criterion接口和Expression类组成。 Criteria接口是Hibernate API中的一个查询接口&#xff0c;它需要由session进行创建。一个单独的查询就是…

统一软件开发过程(RUP)的概念和方法

统一软件开发过程&#xff08;Rational Unified Process,RUP)是一种面向对象且基于网络的程序开发方法论。 根据Rational(Rational Rose和统一建模语言的开发者)的说法&#xff0c;好像一个在线的指导者&#xff0c;它可以为所有方面和层次的程序开发提供指导方针&#xff0c;…

程序员技术开发委托合同模板 私活模板

---需要电子word版&#xff0c;请关注--------- 回复&#xff1a;私活 含税与不含税计算工具&#xff1a; 假设税率是6% 不含税金额&#xff1d;总金额/1.06 税额&#xff1d;不含税金额0.06 增值税在线计算器&#xff1a;http://www.ab126.com/goju/7332.html 大小写转换&…

软件开发模型

1.1大爆炸模型 大爆炸默认是相对简单的开发模型&#xff0c;在开发过程中&#xff0c;没有什么规范和计划&#xff0c;更没有测试 1.2 边做边改模型 相对于大爆炸模型&#xff0c;考虑到了项目需求&#xff0c;然后开发来回的编写&#xff0c;测试&#xff0c;修改缺陷的过程…

10种软件开发模型整理

准备整理一下软件模型&#xff0c;但是百度到都是零散信息&#xff0c;所以文章准备从概念、模型核心思想、优点、缺点、生命周期等体现各个软件模型 什么是软件模型 软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、…

系统软件开发基础知识

系统软件开发基础知识 最近最火的是孩子考了多少分&#xff0c;能上那个好大学&#xff0c;出现了我的大学的我的梦。 他们的大学他们的梦&#xff0c;我是啥&#xff0c;我的软件我的梦。 下面了解到的基础知识做一个归纳&#xff0c;本人了解这方面的知识点可能很片面&…

软件开发测试验收通知书,软件项目开发-客户告知书

为确保项目进度快速进行&#xff0c;在域名备案、开通相关第三方接口、确认功能文档、UI设计沟通和验收等阶段&#xff0c;恳请贵方百忙之中抽出时间积极配合&#xff0c;同时也为避免以后双方产生不必要的纠纷&#xff0c;特此告知贵方在项目进行过程中提供如下必要的配合条件…

利用Windows注册Dll或其他文件

注册Dll文件 前章 有时候&#xff0c;我要使用ActiveX控件&#xff0c;但是。如果别人给了一个Dll没注册进去怎么办。 注册 在电脑开始界面->运行->输入regsvr32“Dll文件所在路径”&#xff08;也可以用winR快捷键输出&#xff09;&#xff0c;如下图&#xff1a;

DLL注入——使用注册表

1.简介 整个系统的配置都保存在注册表中&#xff0c;我们可以通过调整其中的设置来改变系统的行为。 该方式依赖User32.dll&#xff0c;也就是说&#xff0c;需要可执行程序调用到这个系统动态库&#xff0c;我们注入的dll才会被执行到。基本上所有基于GUI的应用程序都使用了…

如何手动运行dll文件,非注册dll

遇到一个dll文件的恶意样本&#xff0c;cuckoo沙箱给出的运行命令如下&#xff1a; cd C:\Windows\System32\ rundll32.exe C:\coreshell.dll,DllMain 方法&#xff1a;rundll32.exe 文件位置,DllMain but会弹出警告 另外一种方法&#xff0c;在专家的文章中有提到 DllM…

怎样在计算机上注册dll文件,win10如何注册dll文件_win10系统dll文件怎样安装

在win10系统中&#xff0c;有着大量的dll文件&#xff0c;这是一种计算机上的一类文件&#xff0c;而且一个DLL文件也可能被不同的应用程序使用&#xff0c;但是许多用户可能都不知道win10注册dll文件的操作&#xff0c;那么win10如何注册dll文件呢&#xff1f;接下来就来告诉大…

Win10注册DLL办法

测试环境&#xff1a;win7 64位系统自动升级到win10 64位系统 经验提升&#xff1a;不要在开始-运行-CMD里面执行&#xff0c;不起作用。 注册步骤如下&#xff1a; 1、准备要注册的DLL文件到指定目录 2、新建一个BAT文件&#xff0c;写入注册命令 3、右键已管理员身份运行注…

怎样在计算机上注册dll文件,注册dll文件【搞定步骤】

喜欢使用电脑的小伙伴们一般都会遇到win7系统注册dll文件的问题&#xff0c;突然遇到win7系统注册dll文件的问题就不知道该怎么办了&#xff0c;其实win7系统注册dll文件的解决方法非常简单&#xff0c;按照 1&#xff1a;在电脑桌面上&#xff0c;依次选中菜单项开始--运行&am…

C#【必备技能篇】注册dll+批量注册dll

文章目录 问题描述&#xff1a;一、注册单个dll&#xff1a;1、把相应的dll放置到System32&#xff08;32位&#xff09;和SysWOW64中2、以管理员身份打开“命令提示符”3、输入cmd指令完成注册4、把相关的dll放置到项目输出路径下&#xff0c;即可成功引用 二、批量注册dll1、…

photoshop cc 2018破解补丁(pscc2018注册机) 附使用方法

1、下载破解程序 破解文件自行到 http://www.ddooo.com/softdown/109954.htm 下载 博主可以到本博客的文件--》pscc2018zcj_109954.rar下载 2、破解 打开Amtemu.exe 第一个下拉框选择 adobe photoshop cc 2015 没错&#xff0c;就是2015 。。2015可以破解2018的 然后点击…

安装ADOBE全系列软件的步骤

第一步&#xff1a;下载Adobe Creative Cloud 这款应用里几乎囊括了Adobe旗下的所有软件&#xff0c;也就是说有了这个应用&#xff0c;以后下载Adobe的任意一款软件&#xff0c;完全不用再去百度搜索下载地址了&#xff0c;更不用担心来源不正有病毒啥的&#xff0c;只要你的电…

Adobe Audition CS6

Adobe Audition CS6是一款功能强大、效果出色的多轨录音和音频处理软件&#xff0c;可在普通声卡上同时处理多达64轨的音频信号&#xff0c;并且最多支持混合128个声道&#xff0c;创建回路并使用45种以上的数字信号处理效果&#xff0c;具有极其丰富的音频处理效果。而且Audit…