加强hibernate的criteria查询中的使用Example查询的-程序员宅基地

技术标签: java  null  string  criteria  hibernate  list  example  object  

        有人说Query更强大,但我人个比较喜欢用criteria,觉得使用criteria才符合Java开发的规范。

criteria在使用example进行关联的对象查询时,会得到非预期的结果。

举个例子:

两个简单实体Department:部门

以及另一个类Employee员工
这两个表的关联关系我就不多说了,这行都应该都懂,呵呵。。。

 

     此时,我需要通过一些特定的条件去查找employee,当然分页什么的就不说了,因为查询条件会根据客户需求不同而不同,所以直接使用Example进行操作
[code=java]
 Criteria criteria = getSession().createCriteria(Employee.class);
 if (empoyee != null) {
 criteria.add(Example.create(empoyee ));//这里会忽略关联
 }
 //.....中间是分页等处理
 List<?> result = criteria.list();
[/code]

注意上面的注释,Example进行查询是会忽略所有的null值以及关联的对象,故,如果我想根据empoyee 的department来查询empoyee 的话,就会将所有的empoyee 都查询出来,因为department被忽略了。

遇到这个问题有两种解决方法:

一、我的做法如下:

[code=java]
 Criteria criteria = getSession().createCriteria(Employee.class);
 if (empoyee != null) {
 criteria.add(Example.create(empoyee ));//这里会忽略关联

//加强后的Example查寻,不再忽略关联对象
criteria.createCriteria("dpartment").add(Restrictions.eq("id",empoyee .getDepartment.getId()));

}
 //.....中间是分页等处理
 List<?> result = criteria.list();
[/code]

二、下面是我在网上看到别人的做法,个人感觉有点麻烦:

(转)那么这个问题怎么解决呢,查看了Example类的源码后,我决定动手修改——当然不能直接去改它的源码,在参考了hibernate官方论坛后,新建了类:

[code=java]

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.Criteria;
import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.SimpleExpression;
import org.hibernate.engine.TypedValue;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.AbstractComponentType;
import org.hibernate.type.Type;
import org.hibernate.util.StringHelper;

/**
* A copy of Hibernate's Example class, with modifications that allow you to
* include many-to-one and one-to-one associations in Query By Example (QBE)
* queries.
* association class </a>
*/
public class Assoc

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/amazing83/article/details/7487285

智能推荐

concurrent.futures源码解析_futures 源代码-程序员宅基地

concurrent.futures模块在异步编程中非常常用,我常用在tornado里用它将同步操作异步化,这么优秀的模块,肯定很好奇它的内部原理的。 在网上搜了一些资料,感觉附加讲解还不如代码详细,于是就自己去看源码了, 而源码非常优秀,文件结构也非常简单,只有三个文件:_base.py:主要定义了一些常量、类、方法等,为thread和process使用process.py:Process_futures 源代码

Android ListView异步加载图片乱序问题,原因分析及解决方案-程序员宅基地

随时随地阅读更多技术实战干货,充分利用闲暇时间,请关注源代码社区公众号(ydmsq666)和技术交流群。转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人...

linux C 自定义回调函数使用_linux 定时器自定义回调函数怎么写_最后冰吻free的博客-程序员宅基地

//call_function.h#ifndef CALL_FUNCTION_H#define CALL_FUNCTION_Htypedef int *callback_random(char *random,int len);void set_callback(callback_random *cb);int genrate_random(char *random,int len);#endif//call_function.c#include "call_function.h"#_linux 定时器自定义回调函数怎么写

c++风格的程序,输入两个整数,将它们由小到大输出_编写一个c++风格的程序,输入两个整数-程序员宅基地

变量的引用练习目录变量的引用练习一、题目二、代码三、结果写在最后一、题目c++风格的程序,输入两个整数,将它们由小到大输出,要求使用变量的引用二、代码#include<iostream>#include<cmath>using namespace std;void cal(int &a,int &b);int main(){ int x,y; cout<<"请输入两个大小不一样的整数"<<endl; cin>_编写一个c++风格的程序,输入两个整数

第27讲、串口通信实验讲解_css串口通讯实验程序讲解-程序员宅基地

一、复习:二、1、在usart.c文件中主函数2、在usart.c中若用printf函数,需要确定串口的类别,是usart1还是usart2deng,需要改成对应的_css串口通讯实验程序讲解

Pycharm远程服务器并调试-程序员宅基地

1.首先下载pycharm专业版,路径自寻,这边就不细说了。(社区版不支持远程配置)2.获取服务器的IP和密码3.打开pycharm,点击菜单栏 :工具tools—>部署deployment–>configuration点击左上方+号step1:与服务器建立连接点击 …点击确定我们的需求是,在pycharm 编译器下 使用服务器 运行代码。因此,与服务器建立连接后,我们需要将本地文件映射到服务器中(有一种镜像的感觉? )故需要在服务器创建一个 文件存放 要运行的代码。s

随便推点

shell中echo命令详解_echo $shell-程序员宅基地

转载自https://blog.csdn.net/vip_wangsai/article/details/72592649linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法。其主要用于字符串的输出。命令格式:语法:#echo [Options] [String]方括号中的项目是..._echo $shell

求解级数问题-程序员宅基地

23.求解级数问题23.1 求几何级数的值如果级数只包含 2n2^n2n 或 e3ne^{3n}e3n 这样的指数,那么它可能是一个或多个几何级数之和首项为 r0=1r^0=1r0=1首项为 ar0=aar^0=aar0=a例1:例2:例3:23.2 应用第 n 项判别法(首要考虑的方法)例子:23.3 应用比式判别法(适用于级数含阶乘、指数)例1:例2:例3:......

华为GRE(vpn)隧道技术,实现不同地域的两公司内网互通!_两个单位间的内网通讯_胖胖不胖、的博客-程序员宅基地

1.拓扑图GRE 是在网络上建立直接点对点连接的一种方法,目的是简化单独网络之间的连接。2.配置概况####R1配置syssys R1dhcp enableacl 2000rule 1 permit source 10.10.10.0 0.0.0.255interface g0/0/1ip address 10.10.10.254 24dhcp select interfaceint g0/0/0ip address 223.1.1.1 24nat outbou..._两个单位间的内网通讯

小红书去水印代码_PHP语言对接抖音快手小红书视频/图片去水印API接口源码-程序员宅基地

以下为PHP语言调用去水印接口的示例,分别展示GET请求方式和POST请求方式的调用方式。示例代码中用到的userId和secretKey请前往开发者接口管理中心获取。GET请求方式调用接口示例:$url = 'https://v.douyin.com/JjEFdHT/';//请把此处的userId和secretKey换成你自己的 这是GET请求方式$api = 'https://api.hen..._小红书去水印接口php源码

FPGA入门学习-程序员宅基地

概述结构1.可编程输入\输出单元2.可配置逻辑块(逻辑阵列块)3.数字时钟管理模块4.嵌入式块5.布线资源6.底层内嵌功能单元7.内嵌专用硬核特点有丰富的FF触发器,更适合完成时序逻辑电路的设计;分段式布线结构决定了其信号的延时是不可预测;有很大的编程灵活性;集成度比较高;基于SRAM编程,所以可以任意编程。可以解决全定制ASIC流片后不可修改的不足;也能克服PLD\CPLD中可编程器件门电路有限的缺点。工作原理查找表:实质上就是一种RAM,FPGA之所以可以反复编程就是因为有查找

TSN源码阅读_项目结构:main.py是训练脚本test_models.py是测试脚本opts.py是参数配置脚本-程序员宅基地

目录一、项目结构1.py文件解释2.函数组成及调用关系3.IPO图二、opts.py解读三、main.py解读四、models.py解读五、dataset.py解读瞎写八写在前第一次读代码,读了快一周了还是迷离迷糊的,不知道从哪读起,也不知道怎么debug,python学的感觉也用不到,用到的都是没学的。慢慢来把,争取下一周读完+能在工作站上跑一下UCF-101的数据集。上周日看了Randy教授的最后一课,感触最深的一段话是他说的遇到困难时候的态度,以前读到这种感觉就是鸡汤一看而过,当真正开始遇到这种_项目结构:main.py是训练脚本test_models.py是测试脚本opts.py是参数配置脚本datas