Spring Data JPA 本机查询中的变量

wal*_*ker 2 java sql spring-data-jpa spring-boot

使用 Spring Dat JPA,我需要查询我的数据库并OrderEntity根据 astartAmt和 aendAmt的数量返回一系列s 。我不确定是否应该将这两个变量映射到 entity OrderEntity,作为某种类型的单独类/实体/模型中的字段,或者只是在我的本机查询中声明它们。也许我应该使用实现EntityManager.createNativeQuery()?

想做类似的事情:


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

}
Run Code Online (Sandbox Code Playgroud)

如果我要EntityManager.createNativeQuery()在服务中使用,可能类似于以下内容:

@Service
public 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;


    }

}

Run Code Online (Sandbox Code Playgroud)

Ioa*_*kos 6

您可以使用 Spring Data JPA 实现这一点,而无需定义本机查询。

@Repository
public interface OrderRangeRepository extends JpaRepository<OrderEntity, OrderEntityID> {
    List<OrderEntity> findByAmountBetween(int startAmt, int endAmt);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

@Service
public class OrderRangeService {

    @Autowired
    OrderRangeRepository orderRangeRepository ;

    public List<OrderEntity> findAmountsBetween(int startAmt, int endAmt) {
        List<OrderEntity> amountsBetween = orderRangeRepository.findByAmountBetween(startAmt, endAmt);
        return amountsBetween;
    }

}
Run Code Online (Sandbox Code Playgroud)

最后,从您的控制器,您应该自动装配 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();
}
Run Code Online (Sandbox Code Playgroud)


sov*_*eav 5

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

}
Run Code Online (Sandbox Code Playgroud)

2. 索引查询参数

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

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