我有两张这样的表:
+------------+ +------------+
| Parent | | Child |
+------------+ +------------+
|child_id |------------>|id |
|id | |date |
|name | +------------+
+------------+
我需要根据Parent
date
类型的对象
这是我的疑问:
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
个对象来自查询清单?
答案 0 :(得分:1)
如果您使用此电话,时间会被切断:
query.setDate(...);
相反,请使用以下调用:
query.setTimestamp(...)
还要尝试使用Criteria Queries
如:
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();
...
答案 1 :(得分:0)
query.setParameter("date",new Date(2012,1,1));
使用setParameter方法而不是setDate
答案 2 :(得分:0)
原来有两个问题,这是每个问题的解决方案:
java.util.Date(int year, int month, int day)
,因为事实证明这会弄乱日期。您可以使用java.util.Calendar
解决此问题,并将日期设置为它。
然后您需要将其转换为java.sql.Date以匹配查询语法
我设法直接从查询中获取了一个List(不依赖于手动迭代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);