检索数据作为自定义对象休眠条件

时间:2018-06-19 12:36:12

标签: java hibernate hibernate-criteria

任务是从数据库中检索某些列列表的数据,并以自定义的现有类返回。

我尝试使用以下代码解决此任务:

public List<EntityOne> getServiceProviders(EntityTwo EntityTwo) {
        Criteria criteria = createCriteria(EntityOne.class);
        criteria.add(Restrictions.eq("EntityTwo", EntityTwo));
        criteria.createAlias("spid", "two");
        criteria.addOrder(Order.asc("two.entityName"));

        criteria.setProjection(Projections.projectionList()
                .add(Projections.property("entityId"), "entityId")
                .add(Projections.property("publishStatus"), "publishStatus")
                .add(Projections.property("two.entityName"), "two.entityName")
                .add(Projections.property("two.entityId"), "two.entityId")
        );

        return criteria.list();
    }

但是我收到的数据列表并没有按我的意愿分组。

2 个答案:

答案 0 :(得分:1)

您的问题不是很清楚,尤其是在您尝试使用Restrictions.eq("EntityTwo", EntityTwo)的地方,因为这不会给出正确的结果。但是,Hibernate提供了一种从使用Hibernate EntityOne类选择的列中返回Transformers作为对象的方法。对于您的情况,您将需要使用要返回的列中的getter setter编写一个自定义类。请注意,变量的名称必须与别名列完全一样。

由于您的示例不清楚,因此让我举一个简单的示例进行说明:假设我需要将所有OrderAmountOrderDate分组的OrderNumber进行购买

 public static List<YourCustomEntity> getAggregateOrders(){
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction tx = null;
    List<YourCustomEntity> list =  new ArrayList<YourCustomEntity>();
    try {
        tx = session.beginTransaction();
        Criteria cr = session.createCriteria(PurchaseOrders.class);
        cr.setProjection(Projections.projectionList()
                .add(Projections.sum("orderAmount").as("sumOrderAmount"))
                .add(Projections.groupProperty("orderNumber").as("agOrderNumber"))
                .add(Projections.groupProperty("orderDate").as("agOrderDate")));
        cr.setResultTransformer(Transformers.aliasToBean(YourCustomEntity.class));
        list = (List<YourCustomEntity>) cr.list();
   }catch (Exception asd) {
        System.out.println(asd.getMessage());
        if (tx != null) {
            tx.rollback();
        }
    } finally {
        session.close();
    }
     return list;
}

在这方面,您将需要您的customEntity具有上面返回的三列。例如:

public class YourCustomEntity {

    private double sumOrderAmount;
    private String agOrderNumber;
    private Date agOrderDate;
   //And then the getters and setters

注意:请注意,变量的命名与列别名相同。

答案 1 :(得分:-1)

您应该使用Projections.groupProperty(propertyName);

criteria.setProjection(Projections.groupProperty("propertyName"));