• 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     }
  • 相关阅读:
    C++的Socket的使用源码
    一些程序技术简介
    VMware安装步骤既常见问题
    操作系统和环境准备
    第一章-硬件组成
    python之面向对象
    指向方法之委托(一)
    Django之URL控制器(路由层)
    python之字符编码(四)
    python之字符编码(三)
  • 原文地址:https://www.cnblogs.com/HEWU10/p/4894489.html
Copyright © 2020-2023  润新知