dea*_*mon 2 java spring jpa jpql spring-data-jpa
与内置方法类似,existsById我想使用existsAllByIdSpring Data JPA 的方法。为了实现这一点,我将以下方法添加到存储库接口中。
@Query(
"select case when (count(thing) = size(:ids)) then true else false end " +
"from Thing thing " +
"where thing.id in :ids")
boolean existsAllById(@Param("ids") Set<UUID> ids);
Run Code Online (Sandbox Code Playgroud)
然而,Hibernate 似乎不喜欢我的使用size并向我报告此错误:
导致:org.hibernate.hql.internal.ast.QuerySyntaxException:意外的表达式?在 org.hibernate.hql.internal 中找到集合函数 size [select case when (count(trhin) = size(:ids)) then true else false end from com.example.Thing Resource where thing.id in :ids]。 ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) 在 org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl. java:282)在org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192)在org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)在org.hibernate .engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:113) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:73) 在 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan (QueryPlanCache.java:162)在org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:613)在org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:725)
如何修复此查询?使用 Spring Data JPA 检查多个 ID 是否存在的最佳方法是什么?
您可以计算找到的项目数量,然后将其与输入的大小进行比较。
请注意,此处使用 Set<> 可以防止出现重复,从而破坏计数。
Integer countAllByIdIn(Set<UUID> ids);
default boolean existsAllById(Set<UUID> ids) {
return countAllByIdIn(ids).equals(ids.size());
}
Run Code Online (Sandbox Code Playgroud)
或者你也可以这样做,关键词是existsAll:
Boolean existsAllByIdIn(Set<UUID> ids);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5322 次 |
| 最近记录: |