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

 1 public Accountref findByUID(String accountUid, String refAccountUid) {
 2         log.debug("finding AccountRef instance with instance: ");
 3         try {
 4             String queryString = "from Accountref as ref where ref.accountByAccountUid.accountUid = ? and ref.accountByRefAccountUid.accountUid = ?";
 5             Query queryObject = getSession().createQuery(queryString);
 6             queryObject.setParameter(0, accountUid);
 7             queryObject.setParameter(1, refAccountUid);
 8             List list = queryObject.list();
 9             if(list.size()>0){
10                 return (Accountref) list.get(0);
11             }
12             return null;
13         } catch (RuntimeException re) {
14             log.error("find by property name failed", re);
15             throw re;
16         }
17     }
原文地址:https://www.cnblogs.com/HEWU10/p/4894489.html