此文以个人开发记录为目的,笔拙勿喷

  项目是背景是公司的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基于外键的查询的更多相关文章

  1. Hibernate 基于外键的双向一对一关联映射

    之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...

  2. Hibernate 基于外键映射的一对一关联关系随手记

    //有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...

  3. Hibernate 基于外键的单项一对一关联映射

    在开发过程中很多时候会用到表与表之间一对一的关联关系,本文简单介绍在Hibernate4中单项一对一的关联映射. 1.设计表结构 2.创建Person对象 3.创建IdCard对象 4.写hbm.xm ...

  4. Hibernate之基于外键映射的一对一(1-1)关联关系

    1.对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性来表示为1 ...

  5. Hibernate(八):基于外键映射的1-1关联关系

    背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...

  6. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  7. 基于EF的数据外键关联查询

    现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦.而我现在要做的就是基于EF的外键关联查询.很方便的. 首先,创建基础查询的BaseS ...

  8. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

  9. Hibernate(11)_基于外键的双向1对1

    一.基于外键的双向1对1 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true&q ...

随机推荐

  1. UWP&WP8.1 中文网页字符乱码 字符乱码 UTF-8转GBK 解决方法

    UWP 方法 async void Download() { /*新建HttpClient*/ HttpClient web_ = new HttpClient(); /*使用HttpClient的G ...

  2. 读《JavaScript权威指南》笔记(四)--数组、函数

    一.数组 1.数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引.JavaScript数组是无类型的:数组元素可以是任意类型,并且同一个数组中的不同元素也可能有 ...

  3. CSS效果:图片切换

    HTML: <html lang="en"> <head> <meta charset="UTF-8"> <meta ...

  4. server12装.NET 3.5

    参考:https://support.microsoft.com/en-us/help/2734782/net-framework-3-5-installation-error-0x800f0906- ...

  5. Mysql INNER JOIN

    1.MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录. 2.INNER JOIN子句是SELECT语句的可选部分,它出现在FROM子句之后. ...

  6. Codeforces Round #533 (Div. 2)题解

    link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...

  7. HDU6298 Maximum Multiple (多校第一场1001)

    Maximum Multiple Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. [转]cron语法

    最近在搞whenever时看到可以用cron语法设置定时任务.所以研究了下cron 语法. every '0 0 27-31 * *'do command "echo 'you can us ...

  9. css3 matrix 矩阵

    2D矩阵变换 matrix(1,0,0,1,0,0) 对应 matrix (a,b,c,d,e,f) 其中,x, y表示转换元素的所有坐标(变量)了, 3*3矩阵每一行的第1个值与后面1*3的第1个值 ...

  10. IE浏览器提示对象不支持“append”属性或方法

    如下代码在IE浏览器中无法执行,提示对象不支持“append”属性或方法 var tImg = document.createElement("img"); tImg.setAtt ...