JPQL查询非实体集合

3

我希望使用一个非实体的集合来进行JPQL查询。这是我的Table实体:

@Entity
@Table(name = "ct_table")
public class Table {
...

@CollectionOfElements(fetch = FetchType.EAGER)
@JoinTable(name = "ct_table_result", joinColumns = @JoinColumn(name = "tableId"))
@MapKey(columns = { @Column(name = "label") })
@Column(name = "value")
private Map<String, String> tableResults;
...

然后我尝试像这样进行查询。
select count(*) from table where table.tableResults['somekey'].value='somevalue'

但我遇到了以下异常:
Cannot create element join for a collection of non-entities!

有什么建议吗?

感谢您的时间。

编辑:

我使用JPA 1和Hibernate 3.3。 JBoss 5中的默认库。

1个回答

8

JPA 2规范(第139页)定义了KEY()VALUE()函数,用于访问映射值元素集合的键和值:

select count(t.id) from Table t 
where KEY(t.tableResults) = 'somekey' and VALUE(t.tableResults) = 'somevalue'

在JPA 1中怎么做?我正在使用Jboss 5.5,必须使用JPA 1,不能使用JPA 2。 - Alex M
你正在使用的 Hibernate 版本是什么? - JB Nizet
JPA 1和Hibernate 3.3。它们是JBoss 5中的默认库。 - Alex M
4
很不幸,尽管此版本的Hibernate支持JPA2,但据我所知,对于KEY和VALUE的支持仍未实现(参见https://hibernate.onjira.com/browse/HHH-5396),即使在当前版本中也是如此。Hibernate有一个index()函数,但我不确定您是否可以将其用于元素集合。请参见http://docs.jboss.org/hibernate/core/3.3/reference/en-US/html_single/。请尝试以下操作:select count(t.id) from Table t join t.tableResults r where index(r) ='somekey' and r ='somevalue'。您还可以使用实体映射,而不是元素映射。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接