JPA jointure externe gauche: est vide ou condition

Je travaille avec jpa requête et je peux trouver une solution appropriée. J'espère que vous pourrez m'aider. Je vais commencer à décrire mon modèle. J'ai une Ressource qui appartient à une société. La société possède de nombreuses Branches. La ressource est associé à un couple de la propriété de la ressource de configuration. Une ressource de propriété décrire les branches peuvent utiliser la ressource et une période de temps dans laquelle cette configuration est valide. Mais, si aucune des branches sont indiqués la ressource peut être utilisée par toutes les branches de la société.

ici est le modèle. Les accesseurs et mutateurs sont omis

@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
public class ResourceOwnerShipConfiguration s'étend 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;  

}

Ce qui est important au sujet de la Branche de Modèle et de Modèle de Société, c'est que les deux ont un Id.

Voici ma requête:

@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)")

Ce que je veux faire? Je veux toutes les ressources qui appartiennent à une société ( à l'aide de companyId) et peut être utilisé par une branche particulière (à l'aide de branchId). Mais si la ressource n'est pas a une liste de branches (défini dans ResourceOwnerShipConfiguration ) doit être retourné.

Espère que c'est clair.

À l'aide de cette requête je ne peux pas récupérer des ressources qui n'ont pas de liste d'une des branches. Seulement ceux qui ont la branche associée.

Merci d'avance.

InformationsquelleAutor Müsli | 2012-04-23