как проверить наличие экземпляра класса - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу проверить наличие поля в моем классе 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",мужа не нужно инициализировать.

1 Ответ

0 голосов
/ 14 февраля 2019

FEI, ошибка, которую я делал, заключалась в том, чтобы сделать предложение INNER JOIN (по умолчанию в Criteria API) (root, query, cb) -> {Join husbandJoin = root.join (муж, слева);return cb.equal (husbandJoin.isNull (), true);};сделал трюк ...

...