我正在尝试生成一个随机数,以便我可以在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,但我只需要一个随机数
答案 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)
@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>