利用hibernate生成的表的别名硬编码的危险以及处理Hibernate: use join table alias on sqlRestriction

2月常规对PaymentApply里不用的关联做了整理,因不易发现,影响了月结而且现在的版本投放指令查询输入金额就会报错
投放申请 对象
 public  class PaymentApply{
        付款凭证(租赁公司)	 
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name =  "FK_PAYMENT_APPROVAL_GY_ID" )
	 private PaymentApprovalGY			paymentApprovalGY;
	 付款凭证(租赁公司)	  
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_AIR_PAYMENT_APPROVAL_ID" )
	 private AirPaymentApprovalHK		airPaymentApprovalHK;
	
} 
  • 查询逻辑Criteria dc = baseDao.getOrderCriteria(PaymentApply.class, BacklogType.PAYMENTAPPLY);
    这句话的本质是Criteria c = session().createCriteria(clazz);
    比如直接的名称匹配,使用这个别名
    dc.createAlias("paymentApprovalGY", "paymentApprovalGY", JoinType.LEFT_OUTER_JOIN);*
    属性的直接查询
    dc.add(Restrictions.eq("paymentApprovalGY.receiptName", payee);
    sql的查询,使用硬编码
    dc.add(Restrictions.sqlRestriction(to_number(replace(paymentapp2_.REAL_PAYMENT_AMOUNT,',','')) >= to_number('"+ payAmountL + "')"));
  • 这里注意paymentapp2_开发人员这样写,是先运行看到sql也就是hibernate生成的表的别名后,再写的硬编码。但是很难知道知道这个是PaymentApply里的哪个关联对象,如果关联对象较多,或者因历史代码原因,当前系统已经不再使用,会在对象里直接删除关联,调整顺序等,这时候paymentapp2_会变成paymentapp3_,因为在编译阶段是不会出错的,所以会有代码谁动谁死的巨大隐患
  • 经查阅资料,不再硬编码,消除了隐患
    Criteria dc = baseDao.getOrderCriteria(PaymentApply.class, BacklogType.PAYMENTAPPLY);
    Criteria pdc=dc.createCriteria("paymentApprovalGY", "paymentApprovalGY", JoinType.LEFT_OUTER_JOIN);
    属性的直接查询不变
    dc.add(Restrictions.eq("paymentApprovalGY.receiptName", payee);
    这里用别名
    pdc.add( Restrictions.sqlRestriction("to_number(replace( {alias}.REAL_PAYMENT_AMOUNT,',','')) >= to_number('" + payAmountL + "')")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值