使用 Spring Dat JPA,我需要查询我的数据库并根据 startAmt
和 endAmt
返回一系列 OrderEntity
金额。我不确定我是否应该将这两个变量映射到实体 OrderEntity
,作为某种类型的单独类/实体/模型中的字段,或者只是在我的 native 查询中声明它们。也许我应该使用实现 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);
}
如果我要在服务中使用 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;
}
}
最佳答案
您可以使用 Spring Data JPA 实现这一点,而无需定义 native 查询。
@Repository
public interface OrderRangeRepository extends JpaRepository<OrderEntity, OrderEntityID> {
List<OrderEntity> findByAmountBetween(int startAmt, int endAmt);
}
如果您想使用 native 查询,请将其更改为
@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;
}
}
最后,您应该从您的 Controller Autowiring 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();
}
关于java - Spring Data JPA native 查询中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453768/