2012-04-23 2 views
2

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

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

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

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

ответ

Смежные вопросы