使用 Spring Data JPA 检查是否存在多个 ID

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 是否存在的最佳方法是什么?

Igo*_*icz 7

您可以计算找到的项目数量,然后将其与输入的大小进行比较。

请注意,此处使用 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)

  • 由于某种原因,即使并非所有 ID 都存在,“existsAllByIdIn”也会返回“true”,但第一种方法工作正常! (4认同)