如何使用Spring Data JPA查询语言查询@ElementCollection属性?

时间:2014-06-02 11:04:08

标签: spring-data-jpa

我的代码如下:

@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 ]

我真的很困惑,我们无法访问映射表的属性。请帮我解决问题。 三江源!

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);