Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA本机查询中的变量_Java_Sql_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java Spring数据JPA本机查询中的变量

Java Spring数据JPA本机查询中的变量,java,sql,spring-boot,spring-data-jpa,Java,Sql,Spring Boot,Spring Data Jpa,使用Spring Dat JPA,我需要查询我的数据库,并根据金额的startAmt和endAmt返回一系列的OrderEntitys。我不确定是否应该将这两个变量映射到实体OrderEntity,作为某种类型的单独类/实体/模型中的字段,或者只是在本机查询中声明它们。也许我应该使用一个实现EntityManager.createNativeQuery()的服务 希望执行以下操作: @Repository public interface OrderRangeRepository extend

使用Spring Dat JPA,我需要查询我的数据库,并根据金额的
startAmt
endAmt
返回一系列的
OrderEntity
s。我不确定是否应该将这两个变量映射到实体
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);

}

1。命名参数

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

@Query(value=“SELECT*FROM订单,其中金额介于:startAmt和:endAmt;”,nativeQuery=true)
列表findOrdersBy(@Param(“startAmt”)int startAmt,@Param(“endAmt”)int endAmt);
}
2。索引查询参数

Spring数据将以相同的顺序向查询传递方法参数 它们出现在方法声明中

@Query(value=“从金额介于?1和?2之间的订单中选择*”,nativeQuery=true)
列出findOrdersBy(int startAmt、int endAmt);

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

@Repository
public interface OrderRangeRepository extends JpaRepository<OrderEntity, OrderEntityID> {
    List<OrderEntity> findByAmountBetween(int startAmt, int endAmt);
}
@存储库
公共接口OrderRangeRepository扩展了JpaRepository{
列出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);
@Query(value=“SELECT*来自金额介于:startAmt和:endAmt之间的订单”,nativeQuery=true)
列表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{
@自动连线
OrderRangeRepository OrderRangeRepository;
公共列表中间的FindAmounts(int startAmt、int endAmt){
List amountsBetween=orderangerepository.findbyamountbween(startAmt,endAmt);
返回之间的金额;
}
}
最后,您应该从控制器自动连接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();
}
@Autowired
OrderRangeService OrderRangeService;
@GetMapping(“/amountsFromAndTo”)
@应答器
公共字符串getAmounts(@RequestParam int startAmt,@RequestParam int endAmt){
List orderEntityL=orderRangeService.FindAmountsBeween(startAmt,endAmt);
返回orderEntityL.toString();
}

——使用
findByAmountBetween(1,2)
将生成一个数字介于1和2之间的查询。如何从HTTP查询字符串(如
http://localhost:8080/amountsFromAndTo?startAmt=1000&endAmt=2000
please?我正在使用第二个示例,原生查询。1,2是一个演示如何在值之间传递from-to的示例。可以用int变量替换1,2。我已经更新了我的答案(第二个例子)。您应该将这些变量从控制器传递到服务和JPA存储库
 @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;
    }

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