2015-04-08 2 views
2

Я использую Hibernate/JPA и QueryDSL. У меня есть эти таблицы в моей базе данных:Изменить тип выборки во время выполнения отношений @ManyToMany Hibernate

Proveedor

IdProveedor | RazonSocial 

Empresa

IdEmpresa | Nombre 

ProveedorEmpresa

IdProveedor | IdEmpresa 

Существует взаимосвязь «многие ко многим» между Proveedor и Empresa. Это мой JPA отображение:

PROVEEDOR

@Entity 
public class Proveedor { 

    private String idProveedor; 
    private String razonSocial; 
    @IgnoredField 
    private List<Empresa> empresas; 

    @Id 
    @Column(name = "IdProveedor") 
    public String getIdProveedor() { 
     return idProveedor; 
    } 

    public void setIdProveedor(String idEmpresa) { 
     this.idProveedor = idEmpresa; 
    } 

    @Basic 
    @Column(name = "RazonSocial") 
    public String getRazonSocial() { 
     return razonSocial; 
    } 

    public void setRazonSocial(String razonSocial) { 
     this.razonSocial = razonSocial; 
    } 

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinTable(name = "ProveedorEmpresa", joinColumns = { 
      @JoinColumn(name = "IdProveedor", nullable = false, updatable = false)}, 
      inverseJoinColumns = { 
        @JoinColumn(name = "IdEmpresa", nullable = false, updatable = false) 
      }) 
    public List<Empresa> getEmpresas() { 
     return empresas; 
    } 

    public void setEmpresas(List<Empresa> empresas) { 
     this.empresas = empresas; 
    } 

} 

EMPRESA

@Entity 
public class Empresa { 

    private String idEmpresa; 
    private String razonSocial; 
    private String abreviatura; 
    private List<Proveedor> proveedores; 

    @Id 
    @Column(name = "IdEmpresa") 
    public String getIdEmpresa() { 
     return idEmpresa; 
    } 

    public void setIdEmpresa(String idEmpresa) { 
     this.idEmpresa = idEmpresa; 
    } 

    @Basic 
    @Column(name = "RazonSocial") 
    public String getRazonSocial() { 
     return razonSocial; 
    } 

    public void setRazonSocial(String razonSocial) { 
     this.razonSocial = razonSocial; 
    } 

    @Basic 
    @Column(name = "Abreviatura") 
    public String getAbreviatura() { 
     return abreviatura; 
    } 

    public void setAbreviatura(String abreviatura) { 
     this.abreviatura = abreviatura; 
    } 

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "empresas") 
    public List<Proveedor> getProveedores() { 
     return proveedores; 
    } 

    public void setProveedores(List<Proveedor> proveedores) { 
     this.proveedores = proveedores; 
    } 
} 

У меня есть этот метод, который возвращает все Empresa с их Proveedor (так как это EAGER выборки):

public List<Empresa> getEmpresasWithProveedores() { 
     JPAQuery query = new JPAQuery(); 
     query.from(qEmpresa); 
     return query.list(qEmpresa); 
} 

Теперь я хочу, это другой метод, который возвращает все Empresa без их Proveedor:

public List<Empresa> getEmpresasWithoutProveedores() { 
     // Set the fetch type to LAZY 
     JPAQuery query = new JPAQuery(); 
     query.from(qEmpresa); 
     return query.list(qEmpresa); 
} 

Я пытался добавить FetchProfile в Empresa сущность: с

@Entity 
@FetchProfile(name = "WITH_PROVEEDORES", fetchOverrides = { 
     @FetchProfile.FetchOverride(entity = Empresa.class, association = "proveedores", mode = FetchMode.JOIN)}) 
public class Empresa { . . . } 

и включить/отключить его перед каждый способ. Но это не работает, оно имеет такое же поведение. На самом деле, я не понимаю, как работает FetchProfile, и как мне настроить его для получения желаемого поведения.

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

ответ

1

Предполагая, что вы используете JPA 2.1, вам необходимо использовать эквивалент JPA FetchProfile, чтобы сделать то же самое.

Ваш класс будет выглядеть следующим образом

@Entity 
@NamedEntityGraph(
     name = "WITH_PROVEEDORES", 
       attributeNodes = { 
    @NamedAttributeNode("proveedores") 
} 
) 
public class Empresa { 
..... 

Вы можете запустить запрос, как это,

private static void queryWithProveedors() { 
    EntityManager entityManager = Persistence.createEntityManagerFactory("tutorialPU"). 
      createEntityManager(); 
    QEmpresa qEmpresa = QEmpresa.empresa; 
    JPAQuery query = new JPAQuery (entityManager); 
    EntityGraph graph = entityManager.getEntityGraph("WITH_PROVEEDORES"); 
    query.from(qEmpresa).setHint("javax.persistence.fetchgraph", graph); 
    query.list(qEmpresa); 
    } 

В случае, если вы не используете JPA 2.1, либо вы должны достать hibernate, а затем использовать FetchProfile или сделать с предложенным подходом here.

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