我正在尝试创建一个JPQL查询,该查询应该从其中一个地图关联中获取一个实体和键,并且我收到了一个奇怪的错误。
我的设置是使用Hibernate(3.5)实现的JPA2。
模型如下:
我有一个Department实体bean,例如:
@Entity
公共类部门{
@Id
@SequenceGenerator(name = "DEPARTMENT_ID_GENERATOR", sequenceName="department_sequence", allocationSize=100)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "DEPARTMENT_ID_GENERATOR")
@Column(unique = true, nullable = false)
protected Long id;
@OneToMany(fetch=FetchType.EAGER)
private Map<String,Phone> phones = new HashMap<String, Phone>();
// ... getters and setters关注
和它的关联实体:
@Entity
公共类电话{
@Id
@SequenceGenerator(name = "PHONE_ID_GENERATOR", sequenceName="phone_sequence", allocationSize=100)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "PHONE_ID_GENERATOR")
@Column(unique = true, nullable = false)
protected Long id;
private int number;
// ... getters and setters关注
现在我想,按照“掌握JPA2 ......”一书,我可以做一个JPQL,如:
String queryString2 = "SELECT d, KEY(p) FROM Department d JOIN d.phones p WHERE p='internal'";
但这一切都让我有了一个奇怪的错误:
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode
- [METHOD_CALL] MethodNode:'(' + - [METHOD_NAME] IdentNode:'KEY'{originalText = KEY} - [EXPR_LIST] SqlNode:'exprList' - [ALIAS_REF] IdentNode:'phone2_.id'{alias = p,className = model.Phone,tableAlias = phone2 _}
at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:156)...
有人可以告诉我,如果我使用的JPQ是错误的,如果是的话,什么可能是一个正确的替代方法来获取一个实体,只有一个地图关联的密钥?
答案 0 :(得分:3)
你的语法是正确的,这是因为KEY&amp;未实现地图的值: https://hibernate.onjira.com/browse/HHH-5396我不知道其他查询。
答案 1 :(得分:3)
对于下一位读者,Mikko Maunu提到的错误昨天刚刚解决,所以我们只需要等待下一个版本:)