我想使用criteria builder构建一个查询,它允许我获取嵌套字段成员的值大于给定值的记录。
//jpa annotations
abstract class SomeAbstractClass{
public abstract SomeAbstractNestedClass getSomeAbstractNestedClass();
}
//jpa annotations
class ConcreteClass extends SomeAbstractClass {
private ConcreteNestedClass concreteNestedClass;
@Override
public SomeAbstractNestedClass getSomeAbstractNestedClass() {
return concreteNestedClass;
}
}
//jpa annotations
@TypeDef(name = "MoneyAmountWithCurrencyType", typeClass = PersistentMoneyAmountAndCurrency.class)
abstract class SomeAbstractNestedClass {
@Columns(columns = {
@Column(name = "money_currency"),
@Column(name = "money_number")})
@Type(type = "MoneyAmountWithCurrencyType")
private Money money;
}
class ConcreteNestedClass extends SomeAbstractNestedClass {}
public Specification<SomeAbstractClass> getSpecification(QueryDto dto) {
return (Root<SomeAbstractClass> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> {
Root<ConcreteClass> concreteClass = cb.treat(root, ConcreteClass.class);
Join<ConcreteClass, ConcreteNestedClass> joinedNested = concreteClass.join("concreteNestedClass", JoinType.LEFT); //SingularAttributeJoin
//second get call causes mentioned exception
//after first call returned attribue is SingularAttributePath
Path<BigDecimal> money = joinedNested.get("money").get("number");
return cq.where(cb.greaterThan(money, dto.getSomeBigDecimal())).getRestriction();
};
}
Money
是一个来自
org.javamoney.moneta
它包含两个字段
currency
和
number
,这两个字段都存储在数据库中的不同列中(
money_currency
和
money_number
),我想实现的是只使用
数字
重视与忽视
通货
.我试图建立一个如上所述的查询,但不幸的是,我得到了一个如下所示的异常,我可以如何处理它的想法?
在代码中注释的地方,我得到了以下异常:
组织。springframework。刀。InvalidDataAccessApiUsageException:非法
尝试取消对基本类型的路径源[null.money]的引用;嵌套的
java是个例外。lang.IllegalStateException:非法尝试
基本类型的解引用路径源[null.money]
另外,我不确定我的继承层次结构是否与
钱
领域