Левое внешнее соединение JPA :пусто или условие

Я работаю с 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, )должен быть возвращен.

Надеюсь, понятно.

Используя этот запрос, я не могу получить ресурсы, у которых нет списка ветвей. Только те, которые связаны с конкретной веткой.

Заранее спасибо.

5
задан Müsli 23 April 2012 в 22:09
поделиться