JPA2 (Hibernate) Cómo consultar 2 tablas (unidas) pero solo necesita propiedades de 2da tabla

StackOverflow https://stackoverflow.com/questions/8333128

Pregunta

Estoy usando JPA2 con Hibernate como proveedor en el entorno Java EE6.

Tengo una relación de uno a muchas y cuando obtengo todas las filas para que un lado se muestre en una página de JSF, quiero mostrar algunas de las propiedades de muchos lados, ** pero no todas ** e incluso evitar cargar esas propiedades cuando las Popular las muchas entidades laterales y no estoy seguro de cómo hacerlo.

Aquí hay un fragmento

Quiero obtener todas las filas para la Tabla A y mostrarlas en la tabla JSF, al mostrar filas para la Tabla A, también quiero mostrar algunas propiedades de la Tabla B en la misma tabla JSF, e idealmente ni siquiera recuperar/almacenar las propiedades no utilizadas de la Tabla B

TBL_A
________________
int     ID
varchar FIRSTNAME
varchar LASTNAME

Y el segundo es

TBL_B
___________
int      ID
varchar  VERSION  // display on jsf page
varchar  XML_DATA //large, don't want to load when getting results for A/B join
int      A_ID     

y mis clases asociadas JPA2 son como

@Entity
@Table(name = "TBL_A")
@NamedQueries // not sure what sql to create to accomplish this?
({ @NamedQuery(name = "A_and_B.findAll", query = "SELECT a FROM EntityA a") })

public class EntityA implements Serializable 
{    
   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @NotNull
   @Column(name = "ID", nullable = false)
   private Integer id;
.

@Column(name = "FIRSTNAME")
private String firstname;
.
@Column(name = "LASTNAME")
private String lastname;
.
@OneToMany(mappedBy = "entityA", fetch = FetchType.EAGER)
private List<EntityB> entityBList;

y mi entidad asociada TBL_B es

@Entity
@Table(name = "TBL_B")  
public class EntityB implements Serializable 
{ 
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@NotNull
@Column(name = "ID", nullable = false)
private Integer id;
.        
@Column(name = "VERSION")
private String version;
.
@Column(name = "XML_DATA")
private String xmlData;
.
@JoinColumn(name = "A_ID", referencedColumnName = "ID")
@ManyToOne
private EntityA entityA;    

Tengo una página JSF que muestra una lista de datos/lista de entradas TBL_A y también la columna de versión de TBL_B, al obtener todas las filas para TBL_A.

Tuve que usar el tipo de búsqueda ansioso por evitar el error de instatiación perezosa hibernada para hacerlo. Espero que sea la forma correcta de hacerlo.

Al cargar todas las entidades TBL_B, supongo que no me importa cargar ansiosamente todas las filas TBL_B en EntityBlist, pero no quiero que la lista de frijoles EntityB tenga su propiedad Xmldata cargada porque es significativamente grande.

¿Alguien puede explicar cómo puedo hacer esto?

¿Cómo puedo hacer que esto suceda con mi consulta con nombre?

public List<EntityA> findAll_A_Entities() 
{
   return em.createNamedQuery("A_and_B.findAll", EntityA.class).getResultList();
}
¿Fue útil?

Solución

Una solución es hacer que la propiedad sea perezosa, pero eso requiere una configuración de compilación adicional; consulte el doc.

La otra opción es mover el campo XMLDATA a una clase derivada y usar soporte de herencia hibernados.

Si estaba consultando EntityB directamente, puede usar la consulta de proyección para seleccionar solo los campos requeridos. Cuando se encuentra en una asociación de colección lo que no es posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top