检索数据作为自定义对象 Hibernate Criteria
Retrieve data as custom object Hibernate Criteria
任务是从数据库中检索特定列列表的数据,并且 return 作为已经存在的自定义 class。
我尝试使用以下代码解决此任务:
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();
}
但是我收到的数据列表没有按照我的意愿分组在 class 中。
你应该使用Projections.groupProperty(propertyName);
criteria.setProjection(Projections.groupProperty("propertyName"));
您的问题不是很清楚,尤其是在您尝试使用 Restrictions.eq("EntityTwo", EntityTwo)
的地方,因为这不会给出正确的结果。然而,Hibernate 提供了一种方法 return EntityOne
作为使用 Hibernate Transformers
class 选择的列中的对象。在您的情况下,您需要编写一个自定义 class,其中包含您正在 return 的列的 getter setter
。请注意,变量的命名必须与别名列完全相同。
由于您的示例不清楚,让我用一个简单的示例来说明:假设我需要按 OrderDate
和 OrderNumber
分组的所有采购 OrderAmount
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 具有上面的三列 returned。例如:
public class YourCustomEntity {
private double sumOrderAmount;
private String agOrderNumber;
private Date agOrderDate;
//And then the getters and setters
注意: 注意变量的命名与列别名相同。
任务是从数据库中检索特定列列表的数据,并且 return 作为已经存在的自定义 class。
我尝试使用以下代码解决此任务:
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();
}
但是我收到的数据列表没有按照我的意愿分组在 class 中。
你应该使用Projections.groupProperty(propertyName);
criteria.setProjection(Projections.groupProperty("propertyName"));
您的问题不是很清楚,尤其是在您尝试使用 Restrictions.eq("EntityTwo", EntityTwo)
的地方,因为这不会给出正确的结果。然而,Hibernate 提供了一种方法 return EntityOne
作为使用 Hibernate Transformers
class 选择的列中的对象。在您的情况下,您需要编写一个自定义 class,其中包含您正在 return 的列的 getter setter
。请注意,变量的命名必须与别名列完全相同。
由于您的示例不清楚,让我用一个简单的示例来说明:假设我需要按 OrderDate
和 OrderNumber
OrderAmount
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 具有上面的三列 returned。例如:
public class YourCustomEntity {
private double sumOrderAmount;
private String agOrderNumber;
private Date agOrderDate;
//And then the getters and setters
注意: 注意变量的命名与列别名相同。