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 ...
随机推荐
- nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx//conf/nginx.conf:117
SSL相关的配置加到了nginx的配置文件中后,nginx竟然启动不起来了 于是用如下命令测试问题所在: /usr/local/nginx/sbin/nginx -c /usr/local/nginx ...
- Leveling Ground(数论,三分法,堆)
Leveling Ground(数论,三分法,堆) 给定n个数和a,b每次可以选择一段区间+a,-a,+b或-b,问最少操作几次能把他们都变成0.n<=1e5. 首先差分一下序列,问题就会变成了 ...
- CI框架源码学习笔记6——Config.php
接着上一节往下,我们这一节来看看配置类Config.php,对应手册内容http://codeigniter.org.cn/user_guide/libraries/config.html. clas ...
- Linux更改文件或目录的所有者和所有组
上节我们说了所有者和所有组的概念, 一个文件它的所有者是谁,属于哪个组的,不同的角色对其的操作权限是不一样的,详细信息请看上节Linux权限管理 这里我们主要说的是怎么去改变这个文件或目录的所有者和所 ...
- 本地私有库的实现 pod
以pods的形式,引入本地相关文件 补充: pod repo 查看本地 pod 目录信息 一, 生成本地库 的描述文件.spec //1.进入的 本地库的 目录 cd 'xxx' //2.初始化本地 ...
- 解读 pytorch对resnet的官方实现
地址:https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py 贴代码 import torch.nn as ...
- 无限期使用WebStorm方式
http://blog.csdn.net/DorAction/article/details/79332421 1.下载补丁:JetbrainsCrack-2.7-release-str.jar ht ...
- C# 事务提交(非数据库)
.Net 2.0开始支持 static void Main(string[] args) { using (TransactionScope ts = new TransactionScope()) ...
- 使用xUnit为.net core程序进行单元测试
第1部分: http://www.cnblogs.com/cgzl/p/8283610.html 第2部分: http://www.cnblogs.com/cgzl/p/8287588.html ...
- Java学习笔记day06_自定义类_ArrayList
1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...