为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

紫衣仙女 2021-04-05 17:14:36
任务是从数据库中检索某些列列表的数据,并以自定义的现有类返回。我尝试使用以下代码解决此任务: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 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

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


由于您的示例不清楚,所以让我用一个简单的示例进行说明:假设我需要OrderAmount按OrderDate和分组的所有购买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

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


查看完整回答
反对 回复 2021-04-14
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

你应该用 Projections.groupProperty(propertyName);

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


查看完整回答
反对 回复 2021-04-14
  • 2 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信