代码之家  ›  专栏  ›  技术社区  ›  Kamil W

JPA规范-使用拆分为两个数据库列的嵌套字段创建查询

  •  0
  • Kamil W  · 技术社区  · 6 年前

    我想使用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]

    另外,我不确定我的继承层次结构是否与 领域

    0 回复  |  直到 6 年前