JAVA 使用jpa原生sql查询字段 别名无值,小白求大神慷慨赐教

sql查询语句 ,其中 realPrice 是别名

 @Query(value = "select *,case when db.order_type_code = 'Db2bOrder' then d.RealTotal else  df.TotalMoney end realPrice from db2border_bill_detail db " +
            "left join db2border d on d.fID =db.source_id " +
            "left join db2brefund df on df.OrderID = db.source_id  where db.group_id = ?1 and db.db2border_bill_id = ?2", nativeQuery = true)
    List<Db2BorderBillDetail> findAllByGroupIdAndDb2BorderBillId(String groupId,Long Id);

在Db2BorderBillDetail实体类增加对应字段,这样查询正常 ,返回的realPrice的字段有值 ,但是发现保存报错 提示“Unknown column 'db2borderb0_.realPrice' in 'field list'”

    @Transient()
    private BigDecimal realPrice;

    public BigDecimal getRealPrice() {
        return realPrice;
    }

    public void setRealPrice(BigDecimal realPrice) {
        this.realPrice = realPrice;
    }

改成这样 则保存正常,但是sql查询的值就为null

    private BigDecimal realPrice;

    @Transient()
    public BigDecimal getRealPrice() {
        return realPrice;
    }

    public void setRealPrice(BigDecimal realPrice) {
        this.realPrice = realPrice;
    }

求大神赐教下,怎么才能查询保存都正常

4个回答

字段用@TableField(exist=false)注解,即:@Transient()改成@TableField(exist=false)试试,

@TableField(exist=false)
 private BigDecimal realPrice;
weixin_43952760
weixin_43952760 感谢您的回答,不过我试了下不行,然后了解了下@TableField(exist=false)是在 Mybatis-plus中用的注解,我这边的话没用到Mybatis-plus。
6 个月之前 回复
最后还是弄多了一步操作,  查询sql 先返回List<Object[]>   再把List<Object[]>转为 List<Db2BorderBillDetail> 了

@Transient注解表示这个字段不存数据库,加上当然数据库是null。是不是你数据库这个字段命名不规范,realPrice默认会找数据库的real_price。
_如果不是这样写的可以用@column注解设置一下对应关系

weixin_43952760
weixin_43952760 回复简单就好o_0: realPrice改成real_price 我尝试了一下取不了值。getRealPrice()方法里处理是个好办法我之前没想到,但是应该不适合我这情况。(RealTotal和TotalMoney是来自不同表) realPrice的值 是根据表Db2BorderBillDetail的一个字段来 判断 是取表B的RealTotal 或者是取表C的 TotalMoney。(总共三张表查询得结果) 实体类Db2BorderBillDetail 不能设置 表B 或表C的字段的对应关系吧。
6 个月之前 回复
pp3736245
简单就好o_0 回复weixin_43952760: 既然不想与数据库对应,加上@Transient注解就可以了。你是想通过RealTotal和TotalMoney来判断realPrice 的值对吧?你这种写法我没尝试过,不知道你把语句里的realPrice 改成real_price能不能自动匹配赋值。不过你可以不在sql语句里处理,而是在代码里处理,getRealPrice()方法里做判断给realPrice赋值不是更简单吗
6 个月之前 回复
weixin_43952760
weixin_43952760 您好,感谢您的回答,数据库没有realPrice 或者 real_price 这个字段,也没有名字近似的字段。(realPrice字段是用 数据库的字段通过计算得出来的结果然后加上别名的,并没有与数据库有对应关系) 所以用不了@column注解吧?(我尝试过@column注解 设置name 或者 insertable=false 也没得出想要的结果)
6 个月之前 回复

case when db.order_type_code = 'Db2bOrder' then d.RealTotal else df.TotalMoney end realPrice
看看你这个判断,你的这个realPrice是从两个表里挑选的字段进行别名,那为什么只在一个表里进行@Transient注解呢?

weixin_43952760
weixin_43952760 回复BestwishesTolover: 嗯嗯 对的。后面我也有改过,不过还是也没有得到想要的效果。
6 个月之前 回复
BestwishesTolover
BestwishesTolover 回复weixin_43952760: 既然你是以Db2BorderBillDetail为最终的查询结果,那么就不应该用*吧而是db.*
6 个月之前 回复
weixin_43952760
weixin_43952760 您好,d.RealTotal 和 df.TotalMoney 是数据库里的字段,和数据库有对应关系的,应该不需要加@Transient,而其它表我也不需要realPrice这个字段返回,应该也不需要加上这个字段并且进行@Transient注解的。我是这么想的,sql里我加了nativeQuery = true这个标识,标识为原生sql,那么这个sql我只需要对Db2BorderBillDetail实体类进行@Transient注解就好了,和其它表的实体类应该是没任何关系的。
6 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问