У меня есть 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);