Я хочу проверить наличие поля в моем классе Woman.Поле является собственным классом (муж), и как женщина, так и муж являются сущностями, хранящимися в базе данных.Класс Husband не инициализируется в конструкторе класса Woman.Позже в программе, после того, как я манипулирую некоторыми экземплярами класса Woman, я хочу проверить, какие записи класса Woman все еще не имеют экземпляра класса Husband (и в случае инициализации их).Мне нужно сделать это с помощью API JpaQueries.По сути, я хочу написать спецификацию "WithNoHusband", чтобы просмотреть мою базу данных.
До сих пор я пробовал что-то вроде
(root,query,cb) -> {
Join<Woman, Husband> husbandJoin = root.join(husband);
return cb.equal(husbandJoin.isNull(), true);
};
в своем классе JpaWomanSpecificationAdapter и
@Value
class WithNoHusband implements WomanSpecification {
@Override
public boolean isSatisfiedBy(Woman object) {
return object.getHusband() == null;
}
}
в моем классе WomanSpecification без удачи.
Когда я хочу проверить, есть ли у женщины Автомобили, все, что мне нужно сделать, это
private org.springframework.data.jpa.domain.Specification<Woman> toJpaSpecification(WithNoCar specification) {
(root,query,cb) -> cb.isEmpty(root.get(car));
}
и
@Value
class WithNoCar implements WomanSpecification {
@Override
public boolean isSatisfiedBy(Woman object) {
return object.getCar().isEmpty();
}
}
в соответствующих классах.
Это базовая структура трех классов
public class Woman{
@Id
Integer id;
@Column
String name;
@OneToOne(mappedBy = "maintenanceImplementation", cascade = ALL, orphanRemoval = true)
@Getter
Husband husband;
@oneToMany(mappedBy = "maintenanceImplementation", cascade = ALL, orphanRemoval = true)
@Getter
List<Car> car;
@Column
@Enumerated(STRING)
@Getter
Type typeOfWoman;
public Woman(Integer id, String name){
this.is=id;
this.name=name;
this.car = new ArrayList<>();
}
}
public class Husband {
@Id
Integer Id;
@OneToOne
@JoinColumn(name = "WomanId", nullable = false)
@Getter
@Setter(PACKAGE)
private Woman Woman;
@Column
String name;
}
public class Car {
@Id
Integer Id;
@ManyToOne
@JoinColumn(name = "WomanId", nullable = false)
@Getter
@Setter(PACKAGE)
private Woman Woman;
@Column
String brand;
}
Что я ожидаю, так это то, что для мужа спецификация withNoHusband верните true в условие isNull.
Конечно, Car был инициализирован как пустой список в конструкторе th, поэтому можно просто запросить, является ли этот список пустым или нет (без указания предложения join) но после того, как предложение для мужа вступило в силу, почему результат запроса выбрать всех женщин без автомобилей и без мужа по-прежнему похож на
unexpected AST node: is near line 1, column 485 [select generatedAlias0
from Woman as generatedAlias0, Woman as generatedAlias1 inner join
generatedAlias1.husband as generatedAlias2 where ( (
generatedAlias0.status=:param0 ) and ( generatedAlias0.cars is empty ) ) and
( generatedAlias2 is null=:param1 )]
?
PS: мне нужно, чтобы муж НЕ инициализировался в конструкторе WOMAN, поскольку (пока) существование мужа основано на typeOfWoman, поэтому, если typeOfWoman равен "widow",мужа не нужно инициализировать.