2013-02-06 198 views
4

我有一個EntityTransaction如下:查詢@ElementCollection JPA

@Entity 
class Transaction extends AbstractEntity<Long>{ 
     private static final long serialVersionUID = 7222139865127600245L; 
     //other attributes 

    @ElementCollection(fetch = FetchType.EAGER, targetClass = java.lang.String.class) 
    @CollectionTable(name = "transaction_properties", joinColumns = @JoinColumn(name = "p_id")) 
    @MapKeyColumn(name = "propertyKey") 
    @Column(name = "propertyValue") 
    private Map<String, String> properties; 

    //getters and setters 
} 

所以,我對transaction_properties數據庫Table

mysql> desc transaction_properties; 
+---------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+---------------+--------------+------+-----+---------+-------+ 
| p_id   | bigint(20) | NO | PRI |   |  | 
| propertyValue | varchar(255) | YES |  | NULL |  | 
| propertyKey | varchar(255) | NO | PRI |   |  | 
+---------------+--------------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

現在,我想搜索實體Transaction密鑰和值。

Path<Map<String, String>> propertiesPath = root.get("properties"); 
    Path<String> propertyKeyPath = propertiesPath.<String> get("propertyKey"); //where m getting error 
    Path<String> propertyValuePath = propertyKeyPath.<String> get("propertyValue"); 
    p = cb.and(p, cb.and(cb.like(propertyKeyPath, "%" + searchTrxnKey + "%"), cb.like(propertyValuePath, "%" + searchTrxnValue + "%"))); 

但是我得到錯誤Path<String> propertyKeyPath = propertiesPath.<String> get("propertyKey");如下:

[...] threw an unexpected exception: org.springframework.dao.InvalidDataAccessApiUsageException: Illegal attempt to dereference path source [null]; nested exception is java.lang.IllegalArgumentException: Illegal attempt to dereference path source [null] 

一個我經歷了參考的是:Spring Data JPA Tutorial Part Four: JPA Criteria Queries但沒有運氣我。

回答

6

解決方案是.join("properties")而不是.get("properties")

Path<Map<String, String>> propertiesPath = root.join("properties"); 
predicate = (predicate != null) ? criteriaBuilder.and(predicate, criteriaBuilder.and(propertiesPath.in(searchTrxnKey), propertiesPath.in(searchTrxnValue))) 
           : criteriaBuilder.and(propertiesPath.in(searchTrxnKey), propertiesPath.in(searchTrxnValue)); 
JPA Criteria API - How to add JOIN clause (as general sentence as possible)

更多