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
不是实体,所以不能在其上运行hql
或jpql
。您必须使用本机查询。或者,您可以创建一个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 计算值