我在Java中设置了一个实体类,与另一个类具有多对多的关系。但是,我不想选择整个实体集合,而是只选择子实体中的属性。这样做的原因是它会降低加载到系统中的数据量,因为根据我的观点,我并不总是需要整个实体。
这是我到目前为止所做的:
@Entity
public class Disposition {
...
@ManyToMany
private List<Project> projects;
...
}
这样可以正常工作并检索Project实例列表。但是,我不想得到所有的处置项目;我只想检索Project.name。
到目前为止,我能够提出的唯一解决方案是使用@Formula注释,但是如果可能的话我想避免这种情况,因为它需要编写本机SQL而不是HQL。
此视图是只读的,因此我不希望对数据进行任何更改。
答案 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"));