JPA规范-按子项计数过滤父项

时间:2020-05-20 07:09:59

标签: java spring jpa spring-data-jpa

我目前正在开发一个僵尸迷你游戏,并且很难编写JPA规范。

我需要恢复我的所有游戏中至少有一个未感染参与者的列表。

我的结构如下:

@Entity
@Table(name = "game", schema = "public")
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "game_id_seq")
    @SequenceGenerator(name = "game_id_seq", initialValue = 1, allocationSize = 1)
    @Column(name = "id")
    private int id;

    @Basic
    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "game")
    private Collection<Participant> participants;
}

@Entity
@Table(name = "participant", schema = "public")
public class Participant { 
    @ManyToOne
    @JoinColumn(name = "id_game", referencedColumnName = "id", insertable = false, updatable = false)
    private Game game;

    @Basic
    @Column
    private Boolean infected;
}

我尝试过:

private static Specification<Game> getRunning() {
    return (root, criteriaQuery, criteriaBuilder) -> {
        CollectionJoin<Game, Participant> participantJoin = root.join(Game_.participants, JoinType.LEFT);
        Predicate p = criteriaBuilder.isNotEmpty(criteriaBuilder.isFalse(participantJoin.get(Participant_.infected)));
        return p;
    };
}

还有:

    private static Specification<Game> getRunning() {
    return (root, criteriaQuery, criteriaBuilder) -> {
        CollectionJoin<Game, Participant> participantJoin = root.join(Game_.participants, JoinType.LEFT);
        Predicate p = criteriaBuilder.notEqual(
                criteriaBuilder.count(
                        criteriaBuilder.equal(participantJoin.get(Participant_.infected), false)), 0);
        criteriaQuery.distinct(false);
        return p;
    };
}

还有许多其他解决方案...

可悲的是,这些代码都不起作用。我知道我想念什么,但我找不到。

谢谢。

0 个答案:

没有答案