[英]Select entity from two tables in hibernate
我有兩個這樣的表:
+------------+ +------------+
| Parent | | Child |
+------------+ +------------+
|child_id |------------>|id |
|id | |date |
|name | +------------+
+------------+
我需要根據date
提取類型為Parent
對象
這是我的查詢:
Query query = session.createQuery(
"SELECT p.child_id, p.id, p.name from Parent p, Child c
WHERE p.child_id = c.id
AND c.date between :date and CURRENT_DATE ");
query.setTimestamp("date",new Date(2012,1,1));
List<Parent> objList = query.list() // List<Object[]> instead of List<Parent>
我已經嘗試了好幾個小時,然后就再也無法接近了。 您能否告訴我查詢的問題或如何實現我的目標?
編輯:我發現一個問題: new Date(2012,1,1)
正在創建3092年的日期,我通過通過java.sql.Date
添加日期來修復它
結果是List<Object[]>
,我知道我可以迭代每個對象向量,並使用對象中的值創建一個新的Parent,但是沒有辦法直接從查詢列表中獲取Parent
對象嗎?
如果使用此呼叫,時間將被切斷:
query.setDate(...);
而是使用以下調用:
query.setTimestamp(...)
也嘗試使用條件查詢
如:
criteria.add(Expression.eq("date", new Date()));
如果查詢沒有日期限制,則可以通過比較日期進行一些實驗。 例如,如下:
...
Date customDate = new Date(2012, 1, 1);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
StringBuilder query = new StringBuilder("from Child c");
query.append(" where c.date >= '" + simpleDateFormat.format(customDate) + "'");
Query result = session.createQuery(query.toString());
List resultList = result.list();
...
query.setParameter("date",new Date(2012,1,1));
使用setParameter方法而不是setDate
原來有兩個問題,這是每個問題的解決方案:
應當避免使用java.util.Date(int year, int month, int day)
因為它弄亂了日期。 您可以使用java.util.Calendar
並為其設置日期來解決此問題。
然后您需要將其轉換為java.sql.Date以匹配查詢語法
我設法使用以下查詢從查詢中直接獲取列表(無需手動迭代Objects[]
列表並自己創建Parent
實體):
Query query = session.createSQLQuery("select p.* from myscheme.Parent p, myscheme.Child c
WHERE p.child_id = c.id AND c.date > :date ")
.addEntity(Parent.class);
query.setTimestamp("date",sqlDate);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.