0

I'm currently developping a zombie mini-game and I'm having a hard time writing a JPA Specification.

What I need is to recover a list of all my games having at least one non-infected participant.

My structure looks like this :

@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;
}

I've tried :

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;
    };
}

And also :

    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;
    };
}

And many other solutions...

Sadly, neither of those codes are working. I know I'm missing something but I can't find out what.

Thank you in advance.

Wàle
  • 23
  • 5

0 Answers0