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

  项目是背景是公司的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. Ubuntu 如何为 XMind 添加快速启动方式和图标

    目录 Ubuntu 如何为 XMind 添加快速启动方式和图标 Ubuntu 如何为 XMind 添加快速启动方式和图标 按照教程Ubuntu16.04LTS安装XMind8并创建运行图标进行Xmin ...

  2. JS随机数生成算法

    ------------------------------------------ 知乎上边淘到的知识,又学到了~ http://www.zhihu.com/question/22818104 -- ...

  3. C#引号中用@报错

    如SQL = " INSERT INTO A SELECT * FROM B@DBLINK "会报“Parameter '@DBLINK' specified but none o ...

  4. select和epoll原理和区别

    对于select和poll,其主要原理跟epoll不同 poll和select的共同点就是,对全部指定设备(fd)都做一次poll,当然这往往都是还没有就绪的,那就会通过回调函数把当前进程注册到设备的 ...

  5. 20.Add Two Numbers(两个链表的和)

    Level:   Medium 题目描述: You are given two non-empty linked lists representing two non-negative integer ...

  6. kuangbin专题七 HDU1754 I Hate It (单点修改维护最大值)

    很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有 ...

  7. shell参数位置

    1给脚本文件传参 #!/bin/bash echo "a $1" echo "b $2" 执行传参: $ ../test.sh a b 输出结果: a a b ...

  8. D - Frogger

    Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...

  9. 表格排序插件datatables

    之前用过表格排序插件tinytables,用到后面,随着需求的更改,发现这个插件真的low到爆了,不适合用于多表格,只有一个表格的页面可以凑合着用,有很多局限性. 之后发现了一款表格排序插件datat ...

  10. Java中的ThreadLocal使用

    ThreadLocal用于下面的场景: 1. 不允许多个线程同时访问的资源 2. 单个线程存活过程只使用一个实例 官方定义如下: This class provides thread-local va ...