HIbernate基于外键的查询
此文以个人开发记录为目的,笔拙勿喷
项目是背景是公司的E签宝平台VIP频道项目进行关联账户增加后,需要做删除时的,联合查询
当前主要表结构账户表Account、
CREATE TABLE `account` (
`id` int(15) NOT NULL auto_increment,
`email` varchar(30) default NULL COMMENT '邮箱地址',
`mobile` varchar(15) default NULL COMMENT '企业为法人手机号',
`loginPwd` varchar(50) default NULL COMMENT '登录口令',
`signPwd` varchar(50) default NULL COMMENT '签名口令',
`type` int(5) default NULL COMMENT '账户类型,1-个人账户,2-企业账户',
`status` int(5) default NULL COMMENT '状态,1-非实名,9-实名',
`authProject` varchar(50) default NULL COMMENT '实名认证类型,1-管理员审核,2-二代证设备审核,3-app审核',
`projRNLevel` int(2) default NULL,
`createDate` timestamp NULL default NULL COMMENT '创建时间',
`modifyDate` timestamp NULL default NULL,
`personId` int(15) default NULL COMMENT '个人账户id',
`organizeId` int(15) default NULL COMMENT '企业账户id',
`pwdRequest` varchar(100) default NULL COMMENT '找回密码问题',
`pwdAnswer` varchar(100) default NULL COMMENT '找回密码问题答案',
`balance` double default NULL COMMENT '余额',
`rate` double default NULL COMMENT '优惠比率',
`overBalance` int(2) default '0' COMMENT '是否允许超额消费',
`alipayId` varchar(30) default NULL COMMENT '支付宝账户id',
`payCoin` double(10,2) default NULL COMMENT '消费额度',
`rejReason` varchar(50) default NULL COMMENT '驳回理由',
`checkPrice` double default NULL COMMENT '实名认证金额',
`bankAccount` varchar(100) default NULL COMMENT '银行账户名',
`bankNum` varchar(50) default NULL COMMENT '账户号',
`bank` varchar(100) default NULL COMMENT '银行名称',
`head` varchar(100) default NULL,
`alertset` varchar(40) default NULL COMMENT '消息推送设置',
`pwdRequest2` varchar(100) default NULL COMMENT '密保问题2',
`pwdAnswer2` varchar(100) default NULL COMMENT '密保问题答案2',
`accountUid` varchar(40) default NULL COMMENT '唯一标识账户的uuid,后续作为主键',
`checktimes` int(2) default '0' COMMENT '已经校验失败次数',
PRIMARY KEY (`id`),
KEY `fk_account_person` (`personId`),
KEY `fk_account_organize` (`organizeId`),
KEY `accountUid` (`accountUid`),
CONSTRAINT `fk_account_organize_1` FOREIGN KEY (`organizeId`) REFERENCES `organize` (`id`),
CONSTRAINT `fk_account_person_1` FOREIGN KEY (`personId`) REFERENCES `person` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=821 DEFAULT CHARSET=utf8
Account表结构
关联账户表refAcocunt
CREATE TABLE `accountref` (
`id` varchar(40) NOT NULL,
`accountUid` varchar(40) NOT NULL COMMENT '账户ID',
`refAccountUid` varchar(40) NOT NULL COMMENT '被导入账户ID',
`createDate` timestamp NULL default NULL COMMENT '创建日期',
`modifyDate` timestamp NULL default NULL COMMENT '修改日期',
PRIMARY KEY (`id`),
KEY `fk_ref_accountref01` USING BTREE (`accountUid`),
KEY `fk_ref_accountref02` (`refAccountUid`),
CONSTRAINT `fk_ref_accountref01` FOREIGN KEY (`accountUid`) REFERENCES `account` (`accountUid`),
CONSTRAINT `fk_ref_accountref02` FOREIGN KEY (`refAccountUid`) REFERENCES `account` (`accountUid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='InnoDB free: 8192 kB; (`refAccountId`) REFER `esign/account`'
refAccount表结构
业务需求是需要通过关联账户表refAccount的两个外键accountUid,refAccountUid关联账户表的accountUid,
本例使用hibernate反向工程生成DAO和实体对象
// Fields
private Integer id;
private Person person;
private Organize organize;
private String email;
private String mobile;
private String loginPwd;
private String signPwd;
private Integer type;
private Integer status;
private String authProject;
private Integer projRnlevel;
private Date createDate;
private Date modifyDate;
private String pwdRequest;
private String pwdAnswer;
private Double balance;
private Double rate;
private Integer overBalance;
private String alipayId;
private Double payCoin;
private String rejReason;
private Double checkPrice;
private String bankAccount;
private String bankNum;
private String bank;
private String head;
private String alertset;
private String pwdRequest2;
private String pwdAnswer2;
private String accountUid; //set and getter
Account实体类
// Fields
private String id;
private Account accountByRefAccountUid;
private Account accountByAccountUid;
private Date createDate;
private Date modifyDate;
// Constructors
Accountref实体类
注意,Accountref内的外键列并不是以java8种常规类型存在,而是Hibernate以实体对象映射的形式。
在反向工程生成的AccountrefDAO中自定义通过2个外键查询的方法,关键在于HQL查询的情况下,需要使用 ref.accountByAccountUid.accountUid,而不是ref.accountUid
public Accountref findByUID(String accountUid, String refAccountUid) {
log.debug("finding AccountRef instance with instance: ");
try {
String queryString = "from Accountref as ref where ref.accountByAccountUid.accountUid = ? and ref.accountByRefAccountUid.accountUid = ?";
Query queryObject = getSession().createQuery(queryString);
queryObject.setParameter(0, accountUid);
queryObject.setParameter(1, refAccountUid);
List list = queryObject.list();
if(list.size()>0){
return (Accountref) list.get(0);
}
return null;
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}
HIbernate基于外键的查询的更多相关文章
- Hibernate 基于外键的双向一对一关联映射
之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...
- Hibernate 基于外键映射的一对一关联关系随手记
//有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...
- Hibernate 基于外键的单项一对一关联映射
在开发过程中很多时候会用到表与表之间一对一的关联关系,本文简单介绍在Hibernate4中单项一对一的关联映射. 1.设计表结构 2.创建Person对象 3.创建IdCard对象 4.写hbm.xm ...
- Hibernate之基于外键映射的一对一(1-1)关联关系
1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性来表示为1 ...
- Hibernate(八):基于外键映射的1-1关联关系
背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...
- hibernate笔记--基于外键的单(双)向的一对一映射关系
假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...
- 基于EF的数据外键关联查询
现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦.而我现在要做的就是基于EF的外键关联查询.很方便的. 首先,创建基础查询的BaseS ...
- Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...
- Hibernate(11)_基于外键的双向1对1
一.基于外键的双向1对1 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true&q ...
随机推荐
- 一种Web服务的go语言实现
0.引言 go语言已成为当今web后台开发的首选语言,关键在于其简洁性和高效并发特性.go中提供了丰富通用的http开发接口,但一般需要对其进一步封装才能更好的用于实际项目中.因此,本文基于开源库(g ...
- day02.1-Linux虚拟操作系统的安装
在windons环境中配置Linux虚拟操作系统,需要事先在Windons系统上下载并安装虚拟运行软件“VMware Workstations”,以下虚拟物理机的建立和虚拟Linux系统的配置都是在该 ...
- Weekly Contest 114
955. Delete Columns to Make Sorted II We are given an array A of N lowercase letter strings, all of ...
- [51nod1190]最小公倍数之和V2(莫比乌斯反演)
题解 传送门 题解 我是真的不明白这玩意儿是怎么跟反演扯上关系的-- 首先 \[ \begin{align} ans &=b\sum_{d|b}{1\over d}\sum_{i=a}^{b} ...
- 数据结构1:数据结构与算法C语言版分析概述
本节开始将带领大家系统地学习数据结构,作为一门计算机专业大二学生的必修课程,该课程面对的目标人群为初步具备基本编程能力和编程思想的程序员(大一接触了 C 语言或者 C++).通过系统地学习数据结构,可 ...
- Runtime常用的几个应用场景
Runtime常见的几个应用场景. Runtime常见应用场景 具体应用拦截系统自带的方法调用(Method Swizzling黑魔法) 实现给分类增加属性 实现字典的模型和自动转换 JSPatch替 ...
- Unity 动画系统 AnimationEvent 动画事件
- 了解Linux系统
++++++++++++++++++++++++++++++++++++++++++++++++++++ 有用的参考链接: 带你初识Linux操作系统:https://www.linuxidc.com ...
- 5月 28日css前端知识
a:link {color : #FF0000} #未访问连接时设置颜色 a:visited {color: #FF0000} #访问过得连接设置颜色 a:hover {color: #F ...
- C语言变参函数的实现原理
1. 变参函数简单示例 #include <stdarg.h> #include <stdio.h> int Accumlate(int nr, ...) { ; ; va_l ...