在规范内联接表

时间:2020-03-26 16:27:22

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

我有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]

1 个答案:

答案 0 :(得分:0)

您必须在... "scp": "Directory.AccessAsUser.All Files.Read.All Group.ReadWrite.All Sites.Read.All User.Read.All User.ReadBasic.All User.ReadWrite.All", ... 内使用实体字段名称,而不是数据库列名称。

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
    .
    .
}