Проблема: некоторые результаты пользовательского метода запроса не возвращаются, если отсутствуют все дочерние классы. - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть 3 объекта сайта, сектор и путь, дети публикации. Сайт может содержать несколько секторов, а сектор может содержать несколько способов.

У меня есть собственный метод запроса для поиска сайтов, которые соответствуют различным критериям.

Все работает хорошо, если мои сайты содержат сектора, которыесодержит Пути, но если у Сайта нет Сектора, он игнорируется поиском.

Вот мои сущности и мой метод запроса.

Редактировать: я изменяю JOIN в методе запроса на LEFT JOIN, ноничего не меняет.

@MappedSuperclass
@Getter @Setter
@NoArgsConstructor
class Publication implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @Column(name = "id_account", nullable = false)
    private Integer idAccount;
    @Column(nullable = false)
    private String name;
    @Column(length = 300)
    private String description;
    @Column(name = "date_of_creation",length = 30, nullable = false)
    private Date dateOfCreation;
    @Column(name = "date_of_update",length = 30, nullable = false)
    private Date dateOfUpdate;

}
@Entity
@Getter @Setter
@NoArgsConstructor
public class Site extends Publication implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(length = 30, nullable = false)
    private String region;
    @Column(name = "is_official_label", nullable = false)
    private boolean officialLabel;
    @OneToMany(mappedBy = "site", orphanRemoval = true, cascade = CascadeType.REMOVE)
    private Set<Sector> sectors;
    @Column(name = "picture_path")
    private String picturePath;

    @Transient
    private MultipartFile picture;

}
@Entity
@Getter @Setter
@NoArgsConstructor
public class Sector extends Publication {

    @ManyToOne
    @JoinColumn(name = "id_site", nullable = false)
    private Site site;
    @OneToMany(mappedBy = "sector", orphanRemoval = true, cascade = CascadeType.REMOVE)
    private Set<Way> ways;

}
@Entity
@Getter @Setter
@NoArgsConstructor
public class Way extends Publication{

    @ManyToOne
    @JoinColumn(name = "id_sector", nullable = false)
    private Sector sector;
    @Column(length = 20, nullable = false)
    private String rating;
    @Column(name = "rating_level", nullable = false)
    private int ratingLevel;
    @Column(nullable = false)
    private int height;
    @Column(name = "pitch_nbr")
    private int pitchNbr;
    @Column(name = "anchor_nbr")
    private int anchorNbr;

}
@Query(value = "SELECT distinct site.* FROM Site site " +
            "LEFT JOIN Sector sector ON site.id = sector.id_site " +
            "LEFT JOIN Way way ON sector.id = way.id_sector " +
            "WHERE (SELECT COUNT(sec.id) FROM Sector sec WHERE sec.id_site = site.id) >= :sectorNbrMin " +
            "AND (:region = 'all' OR site.region = :region) " +
            "AND (:isLabelOfficial = false OR site.is_official_label = :isLabelOfficial) " +
            "AND (way.rating_level <= :ratingLevel)",
            nativeQuery = true)
    List<Site> findAllByFilter (@Param("sectorNbrMin") int sectorNbrMin, @Param("region") String region,
                                @Param("isLabelOfficial") boolean isLabelOfficial, @Param("ratingLevel") int ratingLevel);
...