代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Stefanovskyi Adam

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

  •  0
  • Oleksandr Stefanovskyi Adam  · 技术社区  · 6 年前

    任务是从数据库中检索特定列列表的数据,并作为自定义已经存在的类返回。

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Stanley Mungai    6 年前

    你的问题不是很清楚,尤其是你想用的地方。 Restrictions.eq("EntityTwo", EntityTwo) 因为这不会产生正确的结果。不过,hibernate提供了一种返回 EntityOne 作为使用hibernate选择的列中的对象 Transformers 班级。在您的情况下,您需要编写一个自定义类 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
    

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

        2
  •  -1
  •   Gaurav Srivastav    6 年前

    你应该用 Projections.groupProperty(propertyName);

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