Mar*_*mix 14 java sql hibernate
我有一个复杂的查询跨越7个表,并想知道如何在Hibernate中实现它.
我目前的尝试是使用session.createSQLQuery进行查询,我会将结果映射到特定实体.
我不知道如何做到这一点,因为过去我只使用一个表到一个实体.我需要在哪里指定我想使用可能跨越多个表的复杂查询?这只是在我的代码中吗?我的hbm.xml文件?我无法想到除了目前的尝试之外的任何其他事情.
这是我的查询示例:
String stringQuery =
"select WI.Customer_Id, CU.Card, CU.Code, "+
"PI.Identity_Card, PI.Name, PI.Surname, PI.Gender, "+
"AD.Zip, AD.Geo_Lat, AD.Geo_Long, "+
"CO.City_Geo_Level, "+
"CU.Address_id, CA.Name, "+
"CU.Category_Id, "+
"CU.Status, "+
"Sum(MO.Charged_Points) as Charged_Points, "+
"Sum(MO.Total_Money) as Total_Money, "+
"Count(MO.id) as AmountTransWinner "+
"from Promotions_Winner WI "+
"join Customers CU "+
"on WI.Customer_id = CU.id "+
"join Personal_Info PI "+
"on CU.Personal_Info_Id = PI.id "+
"join Address AD "+
"on CU.Address_Id = AD.id "+
"join Countries CO "+
"on AD.country_id = CO.id "+
"join Campaigns CA "+
"on CU.Campaign_Id = CA.id "+
"join Movements MO "+
"on WI.Movement_Id = MO.id "+
"where WI.Promotion_Id = :pPromotionID "+
"group by "+
"WI.Customer_Id, CU.Card, CU.Fidely_Code, "+
"PI.Identity_Card, PI.Name, PI.Surname, PI.Gender, "+
"AD.Zip, AD.Geo_Lat, AD.Geo_Long, "+
"CO.City_Geo_Level, "+
"CU.Address_id, CA.Name, "+
"CU.Category_Id, "+
"CU.Status";
Run Code Online (Sandbox Code Playgroud)
您不需要SQL来执行此查询.HQL会很好.这样的查询返回一个List<Object[]>,每个Object[]包含一行结果集.因此,您将在索引0处找到客户ID,在索引1处找到卡,等等.您只需循环遍历行并在每次迭代时创建轻量级对象的实例.
见http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-select
他们是这样做的两种方法。
1.您将获得一个列表对象数组。
List<Object[]>
Run Code Online (Sandbox Code Playgroud)
在这里,数组的一个元素代表查询的一行。
2.您可以使用休眠功能ResultTransformer- 为查询的输出创建一个简单的类。-创建一个ResultTransformer。
例如
public class MyResultTransformer implements ResultTransformer {
/*
Method to convert to generic type list
*/
@Override
public List<Employee> transformList(List arg0) {
List<Employee> employees = new ArrayList<Employee>();
for (Object employee : arg0) {
employees.add((Employee) employee);
}
return employees;
}
/*
Code to transform your query output to Object
*/
@Override
public Employee transformTuple(Object[] arg0, String[] arg1) {
System.out.println("MyResultTransformer.transformTuple()");
Employee tempEmp = new Employee();
tempEmp.setEmployee_id((BigInteger) arg0[0]);
return tempEmp;
}
}
Run Code Online (Sandbox Code Playgroud)
-将转换器设置为查询。
Query query=session.createSQLQuery("SELECT * FROM employeedetail"); // You can use named query, SQL native also
query.setResultTransformer(new MyResultTransformer());
List<Employee> employees=query.list();
Run Code Online (Sandbox Code Playgroud)
最后,我可以使用以下代码解决:
String stringQuery =
"select " +
"CU.Card as card, " +
"CU.Fidely_Code as fidelyCode, "+
"PI.Identity_Card as identityCard, " +
"PI.Name as name, " +
"PI.Surname as surname, " +
"PI.Gender as gender, "+
"AD.Zip as zip, " +
"AD.Geo_Lat as geo_lat, " +
"AD.Geo_Long as geo_long, "+
"CO.City_Geo_Level as cityGeoLevel, "+
"CA.Name as campaignName, "+
"CU.Status as status, "+
"Sum(MO.Charged_Points) as pointsCharged, "+
"Sum(MO.Total_Money) as amountPurchase, "+
"Count(MO.id) as amountTransWinner "+
"from Promotions_Winner WI "+
"join Customers CU "+
"on WI.Customer_id = CU.id "+
"join Personal_Info PI "+
"on CU.Personal_Info_Id = PI.id "+
"join Address AD "+
"on CU.Address_Id = AD.id "+
"join Countries CO "+
"on AD.country_id = CO.id "+
"join Campaigns CA "+
"on CU.Campaign_Id = CA.id "+
"join Movements MO "+
"on WI.Movement_Id = MO.id "+
"where WI.Promotion_Id = :pPromotionID "+
"group by "+
"WI.Customer_Id, CU.Card, CU.Fidely_Code, "+
"PI.Identity_Card, PI.Name, PI.Surname, PI.Gender, "+
"AD.Zip, AD.Geo_Lat, AD.Geo_Long, "+
"CO.City_Geo_Level, "+
"CU.Address_id, CA.Name, "+
"CU.Category_Id, "+
"CU.Status ";
//Query query = this.getSession().createSQLQuery(stringQuery).addEntity("", PromotionsWinnerLittle.class);
//Query query = this.getSession().createSQLQuery(stringQuery).setResultSetMapping("PromotionsWinnerLittle");
Query query = this.getSession().createSQLQuery(stringQuery)
.addScalar("card", StandardBasicTypes.LONG)
.addScalar("fidelyCode", StandardBasicTypes.LONG)
.addScalar("identityCard", StandardBasicTypes.STRING)
.addScalar("name", StandardBasicTypes.STRING)
.addScalar("surname", StandardBasicTypes.STRING)
.addScalar("gender", StandardBasicTypes.STRING)
.addScalar("zip", StandardBasicTypes.STRING)
.addScalar("geo_lat", StandardBasicTypes.BIG_DECIMAL)
.addScalar("geo_long", StandardBasicTypes.BIG_DECIMAL)
.addScalar("cityGeoLevel", StandardBasicTypes.LONG)
.addScalar("campaignName", StandardBasicTypes.STRING)
.addScalar("status", StandardBasicTypes.LONG)
.addScalar("pointsCharged", StandardBasicTypes.BIG_DECIMAL)
.addScalar("amountPurchase", StandardBasicTypes.LONG)
.addScalar("amountTransWinner", StandardBasicTypes.LONG)
.setResultTransformer(Transformers.aliasToBean(PromotionsWinnerLittle.class));
//Query query = this.getSession().createSQLQuery(stringQuery);
query = query.setLong("pPromotionID", promotionID);
List lista = query.list();
Run Code Online (Sandbox Code Playgroud)
我刚刚在Select和addScalar + setResultTransformer上添加了“ As”部分
| 归档时间: |
|
| 查看次数: |
44213 次 |
| 最近记录: |