Я работаю с запросом jpa, и я могу найти подходящее решение. Я надеюсь, что вы можете мне помочь. Я начну описывать свою модель. У меня есть ресурс, принадлежащий компании. В компании много филиалов. Ресурс связал пару конфигураций владения ресурсами. Владение ресурсами описывает, какие ветви могут использовать ресурс, и период времени, в котором эта конфигурация действительна. Но если ветви не указаны, ресурс может использоваться всеми филиалами компании.JPA left external join: пусто или условие
вот модель. Получатели и сеттеры опущены
@Entity
public class Resource extends ActivableAbstractModel{
/**
* the serial version uid
*/
private static final long serialVersionUID = -8568230011058859716L;
public Resource() {
this.ownerShipConfigurations = new ArrayList<>();
}
@Column(length=30)
private String name;
private String description;
@ManyToOne(cascade = {}, fetch = FetchType.LAZY, targetEntity=Company.class)
@ForeignKey(name = "FK_company_resource")
@JoinColumn(nullable = false)
private Company company;
@OneToMany(cascade={CascadeType.ALL}, orphanRemoval=true, mappedBy="resource")
private List<ResourceOwnerShipConfiguration> ownerShipConfigurations;
}
@Entity общественного класса ResourceOwnerShipConfiguration расширяет AbstractModel {
/**
* the serial version uid
*/
private static final long serialVersionUID = -4560593105136625002L;
@Embedded
private Period period;
@ManyToOne(targetEntity=Company.class)
private Company company;
@ManyToMany(targetEntity=Branch.class)
private List<Branch> branches;
@ManyToOne
private Resource resource;
}
Что важно Branch модели и модели компании является то, что и есть Id.
Вот мой запрос:
@Query("select R from Resource R join R.ownerShipConfigurations oc join oc.branches b where R.active = true and R.company.id = :companyId and (oc.branches IS EMPTY or b.id = :branchId)")
Что я хочу сделать? Я хочу, чтобы все ресурсы, принадлежащие компании (с использованием companyId), могли использоваться конкретной веткой (с использованием branchId). Но если ресурс не имеет списка ветвей (определенных в ResourceOwnerShipConfiguration), то должен быть возвращен.
Надеюсь, что это ясно.
Используя этот запрос, я не могу получить ресурсы, у которых нет списка ветвей. Просто те, которые связаны с конкретной ветвью.
Заранее спасибо.