2011-01-13 58 views
1

我有一个用Java设置的实体类,具有与另一个类的多对多关系。但是,我不想选择整个实体集合,而只想从子实体中选择一个属性。这样做的原因是它会降低加载到系统中的数据量,因为根据我的观点,我并不总是需要整个实体。如何从休眠关系中的实体中选择属性

这是我到目前为止有:

@Entity 
public class Disposition { 
... 
    @ManyToMany 
    private List<Project> projects; 
... 
} 

这工作得很好,并检索工程实例的列表。但是,我不想获得处置的所有项目;我只想检索Project.name。

唯一的解决办法,我已经能够拿出迄今使用@Formula注解,但我想如果可能避免这种情况,因为它需要编写本地SQL,而不是HQL。

这种观点是只读的,所以我不希望任何对数据的变化是持久的。

回答

2

可以使用hql只得到孩子的名字。它看起来像

"select p.name from Project p where p.parent_id = ?" 

你将不得不定制变量名称,并使用参数化查询来替换?与父母的身份。

是很常见的有确切这种情况量身定制的DAO方法。

0

这是对象关系映射无法帮助你的地方。但是你可以使用Query API,它允许通过HQL查询任意对象,而不是SQL。不是@Formula也使用HQL吗?

0

这是不是休眠,但ebean project可能会介入你。 Ebean是一个ORM项目,它使用JPA注释并允许对象的惰性(部分)加载。

在你的榜样,只得到项目名称将导致该代码:

List<Project> projects = Ebean.find(Project.class) 
    .select("name") // Only name properties are loaded 
    .where().eq("disposition", yourDisposition) 
    .findList(); 

然后,如果你试图让项目业主(或每其他财产),论文的属性将是懒惰的Ebean加载。

0

检出org.hibernate.criterion.Projections。给定一个标准,你可以简单地做到以下几点:

criteria.setProjection(Projections.property("name"));