У меня есть 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: Невозможно найти атрибут с заданное имя [custDetailInstanceId] для этого ManagedType [com.garanti.proactiveretention.data.BaseEntity]