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 ...
随机推荐
- 阿里云linux安装jmeter并进行压测
一.阿里云linux安装JDK 1.下载安装JDK jdk官网,选择linux版本,下载并保存. (一)yum安装 安装epel的yumyuan yum install epel-release -y ...
- linux heap堆分配
heap堆分配在用户层面:malloc函数用于heap内存分配 void* malloc(size_t size); 进程的虚拟内存地址布局: 对用户来说,主要关注的空间是User Space.将Us ...
- java.lang.Exception: No tests found matching(Junit测试异常)
java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=save], {ExactMatcher:fDispl ...
- pytorch实现depthwise convolution
深度分离卷积是Xception这个模型中提出来的(不太确定,但肯定是它让这个概念为大众周知),具体来说分为两步,depthwise conv和pointwise conv,前者对输入特征图的每个通道进 ...
- 【Leetcode】Count and Say
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- Kibana6.x.x——启动后警告信息:Session cookies will be transmitted over insecure connections. This is not recommended.
启动Kibana后,如果你看到如下警告信息: server log [08:03:18.001] [warning][security] Session cookies will be transmi ...
- Kibana6.x.x源码开发——执行 yarn start --no-base-path 启动命令后报错
错误信息如下: Unhandled rejection Error: Request Timeout after 30000ms at /home/kibana_git/kibana6.2.2/nod ...
- 洛谷1026(字符串dp)
常规dp.看到数据很小就直接暴力了,没有预处理.kmp好像过分了-- #include <cstdio> #include <cstring> #include <ios ...
- P2264 情书
传送门 正常会想到字典树 然鹅数据怎么小直接map也能过 然后就写map暴力匹配了 毫无思维难度,毫无代码难度 注意逗号算单词分隔符,如果有句号就算另一句 同一句的单词重复出现只计算一次贡献 再开个m ...
- 浅谈关于树形dp求树的直径问题
在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...