簡體   English   中英

Spring 數據 JPA 本機查詢中的變量

[英]Variables in Spring Data JPA native query

使用 Spring Dat JPA,我需要查詢我的數據庫並根據startAmtendAmt的金額返回一系列OrderEntity 我不確定是否應該將這兩個變量作為實體OrderEntity的 map 作為某種類型的單獨類/實體/模型中的字段,或者只是在我的本機查詢中聲明它們。 也許我應該使用實現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 數據 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;
    }

}

最后,從您的 controller 中,您應該自動裝配 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();
}

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 數據將按照方法參數在方法聲明中出現的順序將方法參數傳遞給查詢

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM