【问题标题】:Join Tables Within Specification连接规范内的表
【发布时间】:2020-03-26 16:27:22
【问题描述】:

我有 2 个实体。

@Entity
@Table(name = "T_LIFE_CYCLE_CUST_DETAIL_PARM")
@Data
public class ActionCriteriaParameter extends BaseEntity {

    public static final String CUST_DETAIL_INSTANCE_ID = "custDetailInstanceId";
     .
     .
     .
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = CUST_DETAIL_INSTANCE_ID)
     private CustomerDetailParameter custDetailInstanceId;
    .
    .
}

@Entity
@Table(name = "T_LIFE_CYCLE_CUST_DETAIL_PARM")
@Data
public class CustomerDetailParameter extends BaseEntity {
   .
   .
   .
}

他们的超类是

@MappedSuperclass
@Data
public class BaseEntity {
    @Id
    @Column(name = "INSTANCE_ID")
    private Timestamp instanceId;
   .
   .
   .
}

要查询这些表,我有一个规范

import static com.garanti.proactiveretention.data.ActionCriteriaParameter.*;

public class ActionCriteriaParameterSpecification  implements Specification<ActionCriteriaParameter> {

    private Long custDetailInstanceId;
    .
    .
    .

    public ActionCriteriaParameterSpecification(Long custDetailInstanceId, ...) {
        this.custDetailInstanceId= custDetailInstanceId;
    .
    .
    .

    }

    @Override
    public Predicate toPredicate(Root<ActionCriteriaParameter> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

        Join<ActionCriteriaParameter, CustomerDetailParameter> join = root.join(CUST_DETAIL_INSTANCE_ID);

        List<Predicate> predicates = new ArrayList<>();
        if (this.custDetailInstanceId!= null) predicates.add(criteriaBuilder.equal(join.get(CUST_DETAIL_INSTANCE_ID), custDetailInstanceId));
    .
    .
    .

        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
    }


}

当我尝试使用 CRUDRepository 查询时

actionCriteriaParameterRepository.findAll(new ActionCriteriaParameterSpecification(customerDetailParameter, status, actionType, min, max, explanationText)).stream().map(this::convertToActionCriteriaDTO).collect(Collectors.toList());

我收到错误:

java.lang.IllegalArgumentException:无法找到属性 此 ManagedType 上的给定名称 [custDetailInstanceId] [com.garanti.proactiveretention.data.BaseEntity]

【问题讨论】:

    标签: java spring spring-boot jpa spring-data-jpa


    【解决方案1】:

    您必须在Specification 中使用实体字段名称,而不是数据库列名称。

    @Entity
    @Table(name = "T_LIFE_CYCLE_CUST_DETAIL_PARM")
    @Data
    public class ActionCriteriaParameter extends BaseEntity {
    
        public static final String CUST_DETAIL_INSTANCE_ID = "CUST_DETAIL_INSTANCE_ID"; // database column name
         .
         .
         .
         @ManyToOne(fetch = FetchType.LAZY)
         @JoinColumn(name = CUST_DETAIL_INSTANCE_ID) // database column name
         private CustomerDetailParameter customerDetailParameter; // entity field name
        .
        .
    }
    

    规格代码

        @Override
        public Predicate toPredicate(Root<ActionCriteriaParameter> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
    
            Join<ActionCriteriaParameter, CustomerDetailParameter> join = root.join("customerDetailParameter");
    
            List<Predicate> predicates = new ArrayList<>();
            if (this.custDetailInstanceId!= null) 
               predicates.add(criteriaBuilder.equal(join.get("instanceId"), custDetailInstanceId)); 
               // where "instanceId" - CustomerDetailParameter id field name
               // ???? why BaseEntity field instanceId is Timestamp, but custDetailInstanceId has Long type
        .
        .
        .
    
            return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
        }
    

    【讨论】:

    • 我在 root.join(CUST_DETAIL_INSTANCE_ID); 上得到了错误;
    • 现在我得到相同的错误替换值无法找到具有给定名称的属性 [customerDetailParameter]
    • 您必须将数据库列名称替换为条件相关代码中其他地方的实体字段名称。
    • 像私有CustomerDetailParameter customerDetailParameter;到私有 CustomerDetailParameter custDetailInstanceId ?;
    • 编辑了问题。同样的错误无法在此 ManagedType [com.garanti.proactiveretention.data.BaseEntity] 上找到具有给定名称 [custDetailInstanceId] 的属性,您介意我也请您编辑您的答案吗?
    猜你喜欢
    • 2021-06-22
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多