【发布时间】: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 ....的事情。你可以参考这个问题stackoverflow.com/questions/18657422/hql-join-collectiontable -
由于
subscription_categories不是实体,所以不能在其上运行hql或jpql。您必须使用本机查询。或者,您可以创建一个Categories实体,然后从Subscription映射@OneToMany -
为什么不从发布完整信息开始呢?从您的 JPA 实体开始。
-
"向我的实体添加一个字符串列表" ...该字段似乎是一个地图,所以不,它不是一个列表。
标签: java sql hibernate jpa spring-data