JPA @ElementCollection如何查询?

2022-09-03 15:28:22

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

@ElementCollection
private Map<Integer, String> categories;

当我使用它时,它会生成一个名为this的表,其中包含以下列subscription_categoriessubscription(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: categories is not mapped

我的问题是这样的:

如何查询@ElementCollection创建的表?


答案 1

不能直接从 中查询。您应该查询基本实体(我假设它的名称是 )。@ElementCollectionSubscription

@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) 上形成,该层使用实体/类名作为参考。我使用了大写的类名,而不是小写的表名。


推荐