如何从休眠关系中的实体中选择属性

时间:2011-01-13 22:21:24

标签: java hibernate annotations

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

这是我到目前为止所做的:

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

这样可以正常工作并检索Project实例列表。但是,我不想得到所有的处置项目;我只想检索Project.name。

到目前为止,我能够提出的唯一解决方案是使用@Formula注释,但是如果可能的话我想避免这种情况,因为它需要编写本机SQL而不是HQL。

此视图是只读的,因此我不希望对数据进行任何更改。

4 个答案:

答案 0 :(得分:2)

您可以使用hql来获取孩子的名字。它看起来像

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

你必须在其中定制变量名,并使用参数化查询来替换?与父母的身份。

对于这种情况,通常会有定制的DAO方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Hibernate,但ebean project可能会让您感到不安。 Ebean是一个使用JPA注释的ORM项目,允许对象进行惰性(部分)加载。

在您的示例中,仅获取项目名称将导致此代码:

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

然后,如果你试图获得项目所有者(或其他所有属性),那么这些属性将由Ebean延迟加载。

答案 3 :(得分:0)

查看org.hibernate.criterion.Projections。根据标准,您可以简单地执行以下操作:

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