为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Data JPA 本机查询中的变量

Spring Data JPA 本机查询中的变量

呼如林 2023-11-10 16:33:41
OrderEntity使用 Spring Dat JPA,我需要查询数据库并根据 astartAmt和 aendAmt金额返回一系列s。我不确定是否应该将这两个变量映射到实体OrderEntity,作为某种类型的单独类/实体/模型中的字段,或者只是在我的本机查询中声明它们。也许我应该使用实现的服务EntityManager.createNativeQuery()?想做类似的事情:@Repositorypublic interface OrderRangeRepository extends JpaRepository<OrderEntity, OrderEntityID> {        @Query(value = "SELECT * FROM Orders WHERE Amount BETWEEN startAmt AND endAmt;" , nativeQuery=true)    List<OrderEntity> findOrdersBy(int startAmt, int endAmt);}如果我要EntityManager.createNativeQuery()在服务中使用,也许如下所示:@Servicepublic class OrderRangeService {    @Autowired    EntityManager entityManager;    public List<OrderEntity> findAmountsBetween() {        List<OrderEntity> amountsBetween = entityManager.createNativeQuery("SELECT * FROM Orders WHERE Amount BETWEEN ?1 AND 2?;")        .setParameter(1, "startAmt")        .setParameter(2, "endAmt")        .getResultList();        return amountsBetween;    }}
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

您可以使用 Spring Data JPA 来实现此目的,而无需定义本机查询。


@Repository

public interface OrderRangeRepository extends JpaRepository<OrderEntity, OrderEntityID> {

    List<OrderEntity> findByAmountBetween(int startAmt, int endAmt);

}

如果您想使用本机查询,请将其更改为


 @Query(value = "SELECT * FROM Orders WHERE Amount BETWEEN :startAmt AND :endAmt" , nativeQuery=true)

List<OrderEntity> findOrdersBy(@Param("startAmt") int startAmt, @Param("endAmt") int endAmt);

您可以通过执行以下操作来调用服务中的查询


@Service

public class OrderRangeService {


    @Autowired

    OrderRangeRepository orderRangeRepository ;


    public List<OrderEntity> findAmountsBetween(int startAmt, int endAmt) {

        List<OrderEntity> amountsBetween = orderRangeRepository.findByAmountBetween(startAmt, endAmt);

        return amountsBetween;

    }


}

最后,从您的控制器中,您应该自动装配 OrderRangeService 并调用 findAmountsBetween 服务方法


@Autowired

OrderRangeService orderRangeService;


@GetMapping("/amountsFromAndTo")

@ResponseBody

public String getAmounts(@RequestParam int startAmt, @RequestParam int endAmt) {

    List<OrderEntity> orderEntityL = orderRangeService.findAmountsBetween(startAmt, endAmt);

    return orderEntityL.toString();

}


查看完整回答
反对 回复 2023-11-10
?
慕沐林林

TA贡献2016条经验 获得超9个赞

1. 命名参数

每个用 @Param 注释的参数必须具有与相应的 JPQL 或 SQL 查询参数名称匹配的值字符串。具有命名参数的查询更易于阅读,并且在需要重构查询时更不易出错。

@Query(value = "SELECT * FROM Orders WHERE Amount BETWEEN :startAmt AND :endAmt;" , nativeQuery=true)
List<OrderEntity> findOrdersBy(@Param("startAmt") int startAmt, @Param("endAmt") int endAmt);

}

2. 索引查询参数

Spring Data 将按照方法参数在方法声明中出现的顺序将方法参数传递给查询

@Query(value = "SELECT * FROM Orders WHERE Amount BETWEEN ?1 AND ?2;" , nativeQuery=true)List<OrderEntity> findOrdersBy(int startAmt, int endAmt);


查看完整回答
反对 回复 2023-11-10
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信