用随机的spel表达式弹出JPA查询

时间:2016-12-23 01:55:53

标签: java spring spring-data-jpa jpql spring-el

我正在尝试生成一个随机数,以便我可以在JPA查询的数据集中进行采样。我已经读到这在任何地方都是完全可能的但我一直都会遇到错误:

代码:

@Query("select t from Telemetry t where t.id = :id and t.updateTimestamp between :startTime and :endTime and #{ #T(java.lang.Math).random() } < :samplingRate ")
Iterable<Telemetry> findFor(@Param("id") String org, @Param("startTime") Instant startTime, @Param("endTime") Instant endTime, @Param("samplingRate") Float samplingRate);

错误:

  

org.hibernate.QueryException:意外的char:'#'[select t from   com.mz.rad.dao.Telemetry t其中t.id =:id和t.updateTimestamp   之间:startTime和:endTime和#{#T(java.lang.Math).random()}&lt;   :samplingRate]

深入研究这个我发现这个例外:

throw new IllegalArgumentException("Parameter with that position [" + parameterPosition + "] did not exist");

参数位置是1或2取决于我使用的语法。

我尝试过使用/不使用哈希。没运气。我正在使用具有random()功能的postgres,但它不喜欢我调用它(这是我的最终目标)。

这个问题是关于使用SPeL,但我只需要一个随机数

2 个答案:

答案 0 :(得分:1)

您可以尝试这样:#

select t from Telemetry t where t.id = :id and t.updateTimestamp between :startTime and :endTime and :#{T(java.lang.Math).random()} < :samplingRate

如果没有,请使用?#

select t from Telemetry t where t.id = :id and t.updateTimestamp between :startTime and :endTime and ?#{T(java.lang.Math).random()} < :samplingRate

答案 1 :(得分:0)

Answer

@Query("select t from Telemetry t where t.id = :id and t.updateTimestamp between :startTime and :endTime and :#{T(java.lang.Math).random()} < :samplingRate ")

帮助碰撞你的POM

   <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.10.5.RELEASE</version>
    </dependency>