记一次jpa @Query关于 别名的查询,顺便求更好的解决方法

sql相关代码

首先这是sql,主要问题在于 realPrice 字段,是由三个表查询得出的结果,根据表A的一个字段 判断 realPrice 是取表B的值 还是表C的值。

@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);

首次尝试

由于表A没有realPrice 字段,所以用@Transient注释。虽然这样查询正常 ,返回的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;
    }

再次尝试

然后在某度搜索了一下解决方案,改为如下那样,还是不好使,这次虽然保存不会报错,但是 查询时 realPrice字段返回为null

    private BigDecimal realPrice;

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

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

然后在csdn里也找了下资料,csdn里有同学提议

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

不过由于@TableField注释是Mybatis-plus的注释,我这边没有用到,也没法证实能否成功。以后有用到Mybatis-plus时会尝试下。
还有同学,提议在实体类getRealPrice() 方法里做处理。但是应该不适合我这情景,realPrice 是根据表A的一个字段 判断 realPrice 是取表B的值 还是表C的值。表A别名都显示不出来,应该也不能正常读取到表B的值和表C的值,所以应该不能处理。

最后

最后还是弄多了一步操作,查询sql时先返回List<Object[]>,再把List<Object[]> 用反射转为List 了。

 public static Object getValueByKey(Object obj, String key) {
        // 得到类对象
        Class userCla = (Class) obj.getClass();
        /* 得到类中的所有属性集合 */
        Field[] fs = userCla.getDeclaredFields();
        for (int i = 0; i < fs.length; i++) {
            Field f = fs[i];
            f.setAccessible(true); // 设置些属性是可以访问的
            try {
            
                if (f.getName().endsWith(key)) {
                    System.out.println("单个对象的某个键的值==反射==" + f.get(obj));
                    return f.get(obj);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        // 没有查到时返回空字符串
        return "";
    }
 @Query(value = "select db.id, db2border_bill_id db2bOrderBillId, db.source_id sourceId, db.source_no sourceNo, db.order_type_code orderTypeCode, " +
            "db.order_type_name orderTypeName, db.total_money totalMoney, db.pay_money payMoney, db.remark remark, db.group_id groupId, db.create_id createId, db.create_name createName," +
            " db.create_date createDate, db.posting_date postingDate, db.company_id companyId, db.company_code companyCode, db.company_name compayName,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<Object[]> findAllByGroupIdAndDb2BorderBillId(String groupId, Long Id);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用JPA @Query进行分页查询的例子: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { @Query("SELECT u FROM User u WHERE u.age >= :minAge") Page<User> findUsersByAge(@Param("minAge") int minAge, Pageable pageable); } ``` 在上面的例子中,我们定义了一个`UserRepository`接口,继承了`JpaRepository`接口,该接口提供了许多常用的CRUD操作。但是,我们想要进行加自定义的查询,这时我们可以使用`@Query`注解。 `@Query`注解中的查询语句可以包含命名参数,例如`:minAge`。我们使用`@Param`注解来指定命名参数的值,例如`@Param("minAge")`表示`minAge`命名参数的值。 要进行分页查询,我们需要使用`Pageable`对象。我们可以在方法参数中添加`Pageable`类型的参数,然后将其传递给`@Query`注解中的查询方法。例如,上面的例子中的`findUsersByAge`方法可以接收一个`Pageable`类型的参数,并将其传递给`@Query`注解中的查询语句。 调用该方法时,我们可以使用`PageRequest`类来创建一个`Pageable`对象,例如: ```java Pageable pageable = PageRequest.of(pageNumber, pageSize); Page<User> users = userRepository.findUsersByAge(18, pageable); ``` 其中,`pageNumber`表示要查询的页码,`pageSize`表示每页的录数。调用`findUsersByAge`方法时,我们将`18`作为`minAge`命名参数的值,将`pageable`作为分页参数的值。查询结果将会返回一个`Page<User>`对象,其中包含了符合查询条件的用户录和分页信息。 需要注意的是,Spring Data JPA默认使用的是`Pageable`进行分页查询。如果需要使用`Sort`进行排序,可以使用`Sort`类型的参数,并将其传递给`@Query`注解中的查询语句。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值