JPA @ElementCollection 我该如何查询?

Posted

技术标签:

【中文标题】JPA @ElementCollection 我该如何查询?【英文标题】:JPA @ElementCollection how can I query? 【发布时间】:2017-05-22 13:01:00 【问题描述】:

我正在使用 Spring JPA,为了向我的实体添加一个字符串列表,我正在使用@ElementCollection,如下所示。

@ElementCollection
private Map<Integer, String> categories;

当我使用它时,它会生成一个名为 subscription_categories 的表,其中包含以下列 subscription(varchar), catergories(varchar) and caterogies_key (int)

如果我在桌面上使用我的 SQL 工具,我可以通过以下方式很好地查询此表

select `subscription_categories`.`subscription` from `subscription_categories` where `subscription_categories`.`categories`='TESTING';

但是,当我尝试在 Spring Data 中使用它时,它会失败并出现“...未映射”错误

以下是一些尝试:

@Query("select s.subscription from subscription_categories s where s.categories = ?1")
    List<Subscription> findUsernameByCategory(String category);



@Query("select s.subscription from categories s where s.categories = ?1")
    List<Subscription> findUsernameByCategory(String category);

两者都返回相同的错误。

引起:org.hibernate.hql.internal.ast.QuerySyntaxException: 类别未映射

我的问题是这样的:

如何查询@ElementCollection 创建的表?

【问题讨论】:

@volatilevar 如果我添加 @CollectionTable(name="SUBSCRIPTION_LIST") 然后尝试查询我得到相同的错误 SUBSCRIPTION_LIST not mapped. 我删除了我的最后一条评论,因为它是错误的。 categories 是外部类的成员。假设类是 Foo,那么你需要做类似select .... from Foo f where .... f.categories .... 的事情。你可以参考这个问题***.com/questions/18657422/hql-join-collectiontable 由于subscription_categories 不是实体,所以不能在其上运行hqljpql。您必须使用本机查询。或者,您可以创建一个Categories 实体,然后从Subscription 映射@OneToMany 为什么不从发布完整信息开始呢?从您的 JPA 实体开始。 "向我的实体添加一个字符串列表" ...该字段似乎是一个地图,所以不,它不是一个列表。 【参考方案1】:

您不能直接从@ElementCollection 查询。你应该查询基础实体(我假设它的名字是Subscription)。

@Query("select s from Subscription s where s.categories = ?1")
List<Subscription> findUsernameByCategory(String category);

如果要按键查询,则使用

@Query("select s from Subscription s where index(s.categories) = ?1")
List<Subscription> findUsernameByCategoryKey(Integer key);

【讨论】:

【参考方案2】:

我也支持@talex,并认为您需要将查询基于@ElementCollection 的父/容器/基础对象。

根据我的经验,以下查询就足够了:

@Query("select category from Subscription subscription inner join subscription.categories category")

旁注:查询subscription_categories 似乎是错误的路径,因为该表是不同层(Sql/Jpql 中的数据库层)的一部分,而查询应该在Hibernate 层(hql)上形成,这使用您的实体/类名作为参考。 我使用了大写的类名,而不是小写的表名。

【讨论】:

以上是关于JPA @ElementCollection 我该如何查询?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 ElementCollection 查询 JPA 实体,其中 ElementCollection 包含给定元素集中的所有元素?

查询中的 JPA 基本类型 ElementCollection 计算值

JPA - 多对多作为 ElementCollection

JPA @ElementCollection 注释是不是总是产生一对多的关系?

查询@ElementCollection JPA

JPA Annotation ElementCollection 在 Spring Boot 中急切获取