JPA2(Hibernate)如何查询2个表(已加入)但只需要第二个表中的某些属性

时间:2011-11-30 21:24:52

标签: hibernate jpa jpql named-query

我在java ee6环境中使用JPA2和hibernate作为提供者。

我有一对多关系,当得到一方显示在JSF页面中的所有行时,我想显示一些方面的属性,**但不是全部**,甚至避免加载那些在填充许多辅助实体时对它们进行属性 我不知道该怎么做。

这是一个片段

我想得到表A的所有行并在jsf表中显示它们, 当显示表A的行时,我还想显示一些属性 来自同一个jsf表中的表B,理想情况下甚至不检索/存储未使用的 表B中的属性

TBL_A
________________
int     ID
varchar FIRSTNAME
varchar LASTNAME

,第二个是

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     

和我的JPA2关联类是这样的

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

和我的TBL_B关联实体

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

我有一个JSF页面,显示TBL_A条目的数据表/列表 获取TBL_A的所有行时,TBL_B中的VERSION列。

我不得不使用EAGER的fetch类型来避免hibernate延迟的instatiation错误 要做到这一点。希望这是正确的方法。

当加载所有TBL_B实体时,我想我不介意急切地加载entityBList中的所有TBL_B行,但我不希望EntityB bean列表加载了xmlData属性,因为它非常大。

有人能解释我怎么能这样做吗?

如何使用我的命名查询来实现这一点

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

1 个答案:

答案 0 :(得分:0)

一种解决方案是使属性变得懒惰 - 但这需要额外的构建配置 - 请参阅doc

另一个选项是将xmlData字段移动到派生类并使用hibernate继承支持。

如果您直接查询EntityB,则可以使用投影查询仅选择所需的字段。当它在集合关联中时是不可能的。