首页 > 解决方案 > 如何检查类实例的存在

问题描述

我想检查我的 Woman 类中是否存在一个字段。该字段是它自己的(丈夫)类,女人和丈夫都是存储在数据库中的实体。Husband 类未在 Woman 类的构造函数中初始化。在程序的稍后时间,在我操作了 Woman 类的一些实例之后,我想检查 Woman 类的哪些条目仍然没有 Husband 类实例(并以防万一初始化它们)。我需要使用 JpaQueries API 来做到这一点。基本上我想编写规范“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 已在 Woman 的构造函数中初始化为空列表,因此可以简单地查询该列表是否为空(无需拼写join 子句),但是在为丈夫准备好 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 是“寡妇”,则不需要初始化丈夫。

标签: jpacriteria-api

解决方案


FEI,我犯的错误是创建一个 INNER JOIN 子句(默认情况下在 Criteria API 中) (root,query,cb) -> { Join urbanJoin = root.join(husband, left); return cb.equal(husbandJoin.isNull(), true); }; 做的伎俩...


推荐阅读