通过@Formula计算年龄的问题

    现在描述一下情况:之前的系统中有一张表,已经有了各种数据,存入了生日列,最近需求要求计算一下年龄,当然这是一个很小的需求,通过各种方式也都可以实现,比如后端从数据库中查出数据后循环挨个计算,在实体中添加一列(列标明为@Transient),将循环计算的结果存入该字段,发送到前端,前端直接显示,亦或者后端不计算,需要前端显示的时候通过对生日这一列做一个计算,添加一列。但是还有一种方式,可能更直接一些,就是通过sql在数据库中计算是不是更简单一些呢。之前在看关于Hibernate的书籍的时候看到过一个注解@Formula.是不是这个注解可以完成这个工作呢。带着试试的态度玩一下(当然这个试试,是有目的的,那就是:只需成功,不许失败)

    但是一开始的尝试,事与愿违,各种尝试,各种失败,我将我踩得坑列在下面:

    1.@Formula(value="TIMESTAMPDIFF(YEAR,birthday,NOW())")

    我们都知道TIMESTAMPDIFF()函数是用来计算不同的时间类型的差值的函数,所以理论上这种方式应该是没有问题的,但是万恶的Hibernate抛出如下异常:

        person0_.YEAR,person0_.birthday,NOW()) as formula0_ from person person0_' at line 1

    Hibernate将类型YEAR当成了一个列,尴尬!

    2 @Formula(value = "SELECT TIMESTAMPDIFF(YEAR,p.birthday,NOW()) from person p where p.id = id")

    那我要是明确的告诉Hibernate,birthday才是我需要的列,YEAR不是呢,会不会有效果呢。然并卵。Hibernate还是抛出同样的异常。

    3.@Formula(value = "(SELECT YEAR(CURDATE())-YEAR(p.birthday)-(RIGHT(CURDATE(),5)<RIGHT(p.birthday,5)) from person p where p.id = id)")

    那就只能想一些其他的通过生日计算年龄的方法了。而这个计算方法中不要出现YEAR这种类型出现。最终在网上找到了上面的函数方式,最终也验证通过。

    鼓掌。。。。。

最后的最后总算是没有辜负自己这次尝试,也希望自己以后还能多做一些尝试。毕竟大牛都是通过不断的尝试积累出来的经验,希望自己在通往大牛的路上继续努力。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值