hibernateマルチテーブルクエリー
2502 ワード
最近プロジェクトではORMフレームワークとしてhibernateが使用されていますが、多くの場合マルチテーブル連合クエリーを使用する必要があります.hibernateを使用する場合、マルチテーブルに対して対応するエンティティクラスがデータベーステーブルに対応していないため、直接HQLを使用してクエリーを行うのは不便です.ネットで検索すると、hibernateのセッションはcreateSQLQuery()メソッドを呼び出すことによってSQL文を直接実行でき、SQLQueryを返し、list()メソッドを呼び出すとクエリーされたデータを取得できることが分かった.
これらは、各要素がクエリーされたテーブルのフィールド値であり、各行がObject[]配列に対応するObject配列(Object[])からなるリストを返します.HibernateはResultSet Metadataを使用して、返されるスカラー値の実際の順序とタイプを判定します.
public List getListFromMutiTable(String sql) {
SQLQuery queryUpdate = getHibernateTemplate().getSessionFactory().getCurrentSession().createSQLQuery(sql);
List objectList = queryUpdate.list();
return objectList;
}
これらは、各要素がクエリーされたテーブルのフィールド値であり、各行がObject[]配列に対応するObject配列(Object[])からなるリストを返します.HibernateはResultSet Metadataを使用して、返されるスカラー値の実際の順序とタイプを判定します.
public List<YiYaEventTipsStats> retrieveActivityStatsInfoList() {
List<YiYaEventTipsStats> eventTipsStatsList = new ArrayList<YiYaEventTipsStats>();
String hql = "select tips.id,tips.title,tips.startTime,tips.endTime,tips.joinCount,u.winCount "
+ "from (select t.id,t.title,t.starttime,t.endtime,count(u.tipid) joinCount from yiya_eventtips t left join yiya_eventtipsuser u on t.id=u.tipid group by t.title,t.id,t.starttime,t.endtime) tips "
+ "left join (select t.tipid,count(t.tipid) winCount from yiya_eventtipsuser t where t.iswin=1 group by t.tipid) u on tips.id=u.tipid";
List list = baseDao.getListFromMutiTable(hql);
int size = list.size();
for(int i=0; i<size; i++) {
YiYaEventTipsStats eventTipsStats = new YiYaEventTipsStats();
BigDecimal id = (BigDecimal )((Object[])list.get(i))[0];
eventTipsStats.setId(id);
String title = (String)((Object[])list.get(i))[1];
eventTipsStats.setTitle(title);
Date startTime = (Date)((Object[])list.get(i))[2];
eventTipsStats.setStartTime(startTime);
Date endTime = (Date)((Object[])list.get(i))[3];
eventTipsStats.setEndTime(endTime);
BigDecimal joinCount = (BigDecimal )((Object[])list.get(i))[4];
eventTipsStats.setJoinCount(joinCount);
BigDecimal winCount = (BigDecimal )((Object[])list.get(i))[5];
eventTipsStats.setWinCount(winCount);
eventTipsStatsList.add(eventTipsStats);
}
System.out.println("size: " + eventTipsStatsList.size());
return eventTipsStatsList;
}
は、Object[]配列を解析することによってのみすべてのカラムインプラントを取得し、setメソッドを呼び出して対応するオブジェクトに設定することで、hibernateのトランザクション管理と同時に複数のテーブルのクエリーを容易に行うことができます.