【问题标题】:Select DISTINCT values form @ElementCollection List<String> in @NamedQuery在 @NamedQuery 中从 @ElementCollection List<String> 中选择 DISTINCT 值
【发布时间】:2014-11-16 14:18:46
【问题描述】:

对于一个项目,我试图在 List @ElementCollection 字段中查找所有不同的类别。每个 foo 实例都分配了一个或多个 String 类别。下面的代码不起作用,因为 JBOSS/Hibernate 在部署 ear 到服务器时会抛出异常:

Error in named query: Foo.listUniqueCategories: org.hibernate.QueryException: not an entity [SELECT DISTINCT f.categories FROM com.Foo f]

我有课:

@Entity(name = "Foo")
@NamedQuery(name = "Foo.listUniqueCategories", query = "SELECT DISTINCT f.categories FROM Foo f")
public class FooEntity
{
   @Id()
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id")
   protected Long id;

   @ElementCollection
   @CollectionTable(name = "categories", joinColumns = @JoinColumn(name = "foo_id"))
   private List<String> categories;

   ...
}

select distinct 有什么问题吗?是否支持在 @EllementCollection 上执行“SELECT DISTINCT”?

任何帮助表示赞赏! 理查德

【问题讨论】:

标签: java hibernate jboss7.x jpa-2.0 jpql


【解决方案1】:

您对 HQL 和 SQL 感到困惑 .. 将您的命名查询替换为以下内容。命名查询始终是 HQL。

SELECT distinct f.categories FROM FooEntity f

但是,我不确定这是否可行。如果您需要找出不同的类别,为什么要查询 FooEntity?为什么不为类别创建实体并运行如下查询。此外,您在列表上调用连接列也是错误的,它应该加入如下实体类型

   @ElementCollection
   @CollectionTable(name = "categories", joinColumns = @JoinColumn(name = "foo_id"))
   private List<**Category**> categories; // replace String with Category

--

select distinct category.name from Category c

Category 是您必须创建的新实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多