我的代码如下:
@Entity
public class A extends AbstractEntity<Long> {
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "propertyKey")
@Column(name = "propertyValue")
private Map<String, String> properties;
}
我使用以下查询
@Query("Select a from A a JOIN a.properties vp where vp.propertyValue = ?2 ")
A findByRequestedSimNumber(String key, String simNumber);
当我运行应用程序时,出现了这样的异常错误:
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException:cannot dereference scalar collection element: propertyValue [Select a from A a JOIN a.properties vp where vp.propertyValue = ?2 ]
我真的很困惑,我们无法访问映射表的属性。请帮我解决问题。 三江源!
答案 0 :(得分:2)
您的查询必须看起来像
Select a from A a, IN(a.properties) as vp where vp.propertyValue = ?2
你不能只是要求集合中的平等。
如果您的问题是访问给定A中的属性,它们会自动加载A对象,因此您只需要
A a = <some finder method>
System.out.println(a.properties);
答案 1 :(得分:2)
在repositories deep dive code examples我们这样做:
产品实体:
@Entity
public class Product extends AbstractEntity {
...
@ElementCollection
private Map<String, String> attributes = new HashMap<String, String>();
...
}
允许查询任意产品属性的存储库查询方法:
@Query("select p from Product p where p.attributes[?1] = ?2")
List<Product> findByAttributeAndValue(String attribute, String value);