我有Entity Transaction以下内容:
Entity
Transaction
@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 }
所以,我的数据库Table为transaction_properties是
Table
transaction_properties
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");以下错误:
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教程第四部分:JPA标准查询,但对我来说没有运气。
该解决方案是.join("properties")不是.get("properties")。
.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));