如何在休眠标准中查询特定字段

时间:2010-08-30 11:44:27

标签: hibernate

我只需要获取特定的字段而不是所有字段。我的所有桌子都有审计领域(4)。我希望在选择上省略这一点。如何从映射中做到这一点。还有其他办法吗?。

Criteria criteria = session.createCriteria(Property.class, "property")
                .createAlias("property.propertyType", "type").createAlias(
                        "property.propertyConcern", "propertyConcern",
                        CriteriaSpecification.LEFT_JOIN).createAlias(
                        "propertyConcern.concern", "concern",
                        CriteriaSpecification.LEFT_JOIN)
                        .setResultTransformer(
                        CriteriaSpecification.DISTINCT_ROOT_ENTITY);

2 个答案:

答案 0 :(得分:1)

使用ProjectionList仅返回您所追踪的字段。

Criteria criteria = session.createCriteria(Property.class, "property")
    .setProjection(Projections.projectionList()
        .add(Projections.property("property.field1"))
        .add(Projections.property("concern.field2"))
        /*etc*/)
    /*etc etc etc*/;

结果是一个数组数组。

for (Object result : criteria.list()) {
    final Object[] fields = (Object[]) result;
    log.info("property.field1={}, concern.field2={}", fields[0], fields[1]);
}

顺便说一句,您的实体名称“Property”可能会导致与现有Hibernate类混淆/冲突,尤其是因为您使用的是Criteria。

答案 1 :(得分:0)

你必须使用Transformers.aliasToBean(Property.class) ..

ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("p.id"), "id");//"id" should match with the property name to call setters
properties.add(Projections.property("p.fname"), "fname");
properties.add(Projections.property("s.lname"), "lname");


criteria.setProjection(properties);
criteria.setResultTransformer(Transformers.aliasToBean(Student.class));
List<Student> students = (List<Student>) criteria.list();