JPA @ElementCollection如何查询?

时间:2017-01-08 00:30:33

标签: java sql hibernate jpa spring-data

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

class BaseStrategy
  class << self
    def inherited(klass)
      register_strategy(klass)
    end

    def register_strategy(strategy)
      puts "Adding strategy #{strategy}"
    end
  end
end

class Foo < BaseStrategy
end

当我使用它时,它会生成一个名为@ElementCollection private Map<Integer, String> categories; 的表,其中包含以下列subscription_categories

如果我在桌面上使用我的SQL工具,我可以使用以下

查询此表
subscription(varchar), catergories(varchar) and caterogies_key (int)

但是,当我尝试在Spring Data中使用它时,它会失败,并且#34; ...未映射&#34;错误

以下是一些尝试:

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

两者都返回相同的错误。

  

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

我的问题是:

如何查询@ElementCollection创建的表?

2 个答案:

答案 0 :(得分:4)

您无法直接从PForm1 f= new PForm1(); if(f.ShowDialog()!=DialogResult.OK){ //... } PForm2 f2= new PForm2(); if(f2.ShowDialog()!=DialogResult.OK){ //... } //.... 查询。您应该查询基本实体(我假设其名称为@ElementCollection)。

Subscroption

如果要按键查询,请使用

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

答案 1 :(得分:2)

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

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

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

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