JPA2 (Hibernate) comment interroger 2 tables (jointe), mais seulement besoin de propriétés de 2e table CERTAINS

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

Question

J'utilise JPA2 avec mise en veille prolongée en tant que fournisseur dans un environnement java EE6.

J'ai un à plusieurs rapports et lors de l'obtention de toutes les lignes pour un côté à afficher dans une page JSF, je veux afficher certaines des nombreuses propriétés de côté, ** mais pas tous ** et même éviter de charger les propriétés lors du remplissage les nombreuses entités secondaires et je ne suis pas sûr de savoir comment faire.

Voici un extrait

Je veux obtenir toutes les lignes pour le tableau A et les afficher dans le tableau JSF, lors de l'affichage des lignes pour le tableau A, je veux afficher également des propriétés du tableau B en même table de jsf, et idéalement même pas récupérer / stocker les inutilisé les propriétés du tableau B

TBL_A
________________
int     ID
varchar FIRSTNAME
varchar LASTNAME

et le second

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     

et mes de la classe associée de JPA2 sont comme si

@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;

et mon entité associée à TBL_B est

@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;    

J'ai une page JSF qui affiche une datatable / liste des entrées tbl_a et aussi la colonne VERSION de TBL_B, lors de l'obtention de toutes les lignes pour tbl_a.

Je devais utiliser le type d'extraction de mise en veille prolongée pour éviter EAGER erreur instatiation paresseux pour faire ça. espoir thats la bonne façon de le faire.

lors du chargement de toutes les entités TBL_B Je suppose que je ne me dérange pas de charger avec impatience toutes les lignes de TBL_B à entityBList, mais je ne veux pas la liste des haricots entityB avoir Thier propriété XmlData chargé car il est beaucoup plus grande.

Quelqu'un peut-il expliquer comment je peux le faire?

Comment puis-je y arriver avec ma requête nommée

public List<EntityA> findAll_A_Entities() 
{
   return em.createNamedQuery("A_and_B.findAll", EntityA.class).getResultList();
}
Était-ce utile?

La solution

Une solution consiste à rendre la propriété paresseux - mais qui nécessite une configuration de construction supplémentaire - reportez-vous à la doc .

L'autre option consiste à déplacer le champ XmlData à un support de mise en veille prolongée héritage de classe et d'utilisation dérivée.

Si vous interrogez, vous pouvez directement l'Entité utiliser la requête de projection sélectionnées uniquement les champs requis. Quand il est dans une association de collecte qui est impossible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top