如何通过JPQL访问JPA中的Map字段

时间:2013-11-26 22:17:42

标签: jpa orm openjpa

例如,如果@ElementCollection文件的类型为Map,那么如果我尝试获取地图键或值字段,那么如何处理?

Class Deal{
.....

private String name;

private String department;

private DealType type;

@AttributeOverrides({
    @AttributeOverride(name="value.in.available", column=@Column(name="in_avl")),
    @AttributeOverride(name="value.in.unavailable", column=@Column(name="in_unv")),
    @AttributeOverride(name="value.out.available", column=@Column(name="out_avl")),
    @AttributeOverride(name="value.out.unavailable", column=@Column(name="out_unv"))
})
@ElementCollection(fetch = FetchType.EAGER)
    ......
}

所以,如果我试图得到这样的东西

select new SummaryAmount(SUM(t.value.in.available), SUM(t.value.in.unavailable),
SUM(t.value.out.available), SUM(t.value.out.unavailable)) from Deal AS d INNER 
JOIN d.transactionAmounts t GROUP by t.key;

现在有可能成功吗?除了我发明t.valuet.key之外,一切都跟着这本书,因为我真的不知道如何在JPQL中呈现地图键和值。谢谢

由于

1 个答案:

答案 0 :(得分:3)

试试这个:

SELECT new SummaryAmount(SUM(VALUE(t).in.available), SUM(VALUE(t)in.unavailable),
SUM(VALUE(t).out.available), SUM(VALUE(t).out.unavailable)) from Deal AS d INNER 
JOIN d.transactionAmounts t GROUP by KEY(t);

现在摘自JPA规范:

  

由KEY,VALUE或ENTRY限定的标识变量   operator是一个路径表达式。 KEY,VALUE和ENTRY运算符可以   仅适用于对应的识别变量   地图值关联或地图值元素集合。的类型   路径表达式是作为结果计算的类型   操作;也就是说,字段的抽象模式类型   KEY,VALUE或ENTRY运算符的值(映射键,映射值或   地图条目分别)。[53]

     

限定识别变量的语法如下。

     

qualified_identification_variable :: =

     

KEY (identification_variable)|

     

VALUE (identification_variable)|

     

<强> ENTRY (identification_variable)

     

使用KEY或VALUE运算符的路径表达式可以更进一步   组成。使用ENTRY运算符的路径表达式是终端。它   无法进一步组合,只能出现在一个SELECT列表中   查询。