当前位置: 首页 > 知识库问答 >
问题:

如何在查询中编写JPA来检查集合是否给定了一组值?

汲品
2023-03-14
@javax.persistence.Entity
public class Device extends AbstractEntity implements Serializable {
    @ElementCollection
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<String> labels;
}
@Query("SELECT DISTINCT d FROM Device d JOIN d.labels l WHERE d.entity.id IN :entity_ids AND l IN :labels ")
List<Device> find(@Param("entity_ids") Set<Long> entityIds, @Param("labels") Set<String> labels);

@Query("SELECT d FROM Device d WHERE d.entity.id IN :entity_ids AND  d.labels IN :labels") List<Device> 
find(@Param("entity_ids") Set<Long> entityIds, @Param("labels") Set<String> labels);

org.springframework.dao.invalidDataAccessapiUsageException:参数值[D2_label1]与预期的类型[java.util.Collection(N/A)]不匹配;嵌套异常为java.lang.IllegalArgumentException:参数值[D2_label1]与org.springframework.orm.jpa.EntityManagerFactorYutils.ConvertJpaAccessExceptionIFPossible(EntityManagerFactorYutils.java:373)(org.springframework.orm.jpa.vendor.hibernatejpadialt.translateExceptionIFPossible(hibernatejpadialt.java:255)中的预期类型[java.util.Collection(n/a)]不匹配

谁能给我一个解决办法吗?

共有1个答案

蔚宏大
2023-03-14

你不能做你想做的事。正如文档中所述:

in谓词执行检查特定值是否在值列表中。它的语法是:

in_expression::=single_valued_expression[NOT]INsingle_valued_list

single_valued_expression的类型和single_valued_list中的单个值必须一致。

JPQL将此处的有效类型限制为字符串、数值、日期、时间、时间戳和枚举类型,并且在JPQL中,single_valued_expression只能引用:

>

  • “状态字段”,这是它对简单属性的术语。具体地说,这排除了关联和组件/嵌入属性。

    所以,我看到以下几种做法:

    1. 按以下方式重写查询:
    @Query("SELECT DISTINCT d FROM Device d join fetch d.labels WHERE d.entity.id IN :entity_ids")
    List<Device> find(@Param("entity_ids") Set<Long> entityIds);
    

    然后在java代码中进行进一步的筛选。

    @Entity
    public class Device extends AbstractEntity implements Serializable {
    
        @OneToMany
        private List<Label> labels;
    }
    
    @Entity
    public class Label
    {
       @Id
       private Long id;
    
       private String text;
    }
    
    @Query("SELECT DISTINCT d FROM Device d join fetch d.labels l WHERE d.entity.id IN :entity_ids and l.text in :labels")
    List<Device> find(@Param("entity_ids") Set<Long> entityIds, @Param("labels") Set<String> labels);
    

  •  类似资料:
    • 我需要在JPA查询中传递这个参数。 我如何才能实现这一点,而不是为IS NULL&IS NOT NULL创建2个单独的查询。

    • 检查给定行是否为java代码的正确方法是什么? 输入:日志支持。java:44 com/sun/activation/registries/LogSupport日志(Ljava/lang/String;)五、 预期输出:false。 输入:扫描仪输入=新扫描仪(系统输入); 预期输出:true。 我尝试了EclipseJDTASTParser来检查是否可以创建AST。代码如下: 但这是行不通的。有

    • 我在mySql中有一个查询,我想在我的控制器中编写。 原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:应为CLOSE,在org.hibernate.internal.exceptionConverterImpl.convert(exceptionConverterIm

    • 当我按下搜索按钮时,出现以下错误: 发生错误: 异常[EclipseLink-4002](Eclipse持久性服务-2.3.2.v20111125-r10461):org。日食坚持不懈例外。DatabaseException内部异常:java。sql。SQLException:索引处缺少IN或OUT参数::1错误代码:17041调用:从CRM_DAILY_SHEET WHERE to_char(报

    • 例如,对于以下树: n1(值:1,左:空,右:空)n2(值:2,左:n1,右:n3)n3(值:3,左:空,右:空)调用包含(n2,3)应该返回true,因为根目录在n2的树包含数字3。 我是编程新手,试图解决理解编程概念的挑战。这不是作业问题。 我已经编写了下面的代码,但它总是返回false。

    • 本文向大家介绍JavaScript 检查集合中是否存在值,包括了JavaScript 检查集合中是否存在值的使用技巧和注意事项,需要的朋友参考一下 示例 要检查集合中是否存在给定值,请使用方法:.has() true如果someVal出现在集合中,将返回,false否则返回。