Я работаю с jpa-запросом и могу найти правильное решение. Я надеюсь, что вы можете мне помочь. Начну описание моей модели. У меня есть ресурс, который принадлежит компании. Компания имеет множество Филиалов. Ресурс связан с парой конфигураций владения ресурсом. Владение ресурсом описывает, какие ветви могут использовать ресурс и период времени, в течение которого эта конфигурация действительна. Но, если филиалы не указаны, ресурсом могут пользоваться все филиалы компании.
Вот модель. Геттеры и сеттеры опущены
@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 extends 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;
}
Что важно в модели филиала и модели компании, так это то, что обе они имеют идентификатор.
Вот мой запрос:
@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, )должен быть возвращен.
Надеюсь, понятно.
Используя этот запрос, я не могу получить ресурсы, у которых нет списка ветвей. Только те, которые связаны с конкретной веткой.
Заранее спасибо.