2012-04-23 21 views
2

私はjpaクエリで作業しており、私は適切な解決策を見つけることができます。あなたが私を助けることを願っています。私は自分のモデルについて説明し始めます。私は会社に所属するリソースを持っています。同社には多くの支店があります。リソースは、2つのリソース所有権設定に関連付けられています。リソースの所有権は、どのブランチがリソースを使用できるか、およびこの構成が有効である期間を記述します。しかし、ブランチが表示されない場合、そのリソースは会社のすべての支店で使用できます。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は支店のモデルと当社のモデルに関する重要なの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; 

}

を拡張し、省略されている両方の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で定義された)ブランチのリストがない場合は、返さなければなりません。

希望です。

このクエリを使用すると、リストを持たないリソースを取得できません。特定のブランチが関連付けられているものだけです。

ありがとうございます。

答えて