繁体   English   中英

从休眠的两个表中选择实体

[英]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

原来有两个问题,这是每个问题的解决方案:

  1. 日期问题

应当避免使用java.util.Date(int year, int month, int day)因为它弄乱了日期。 您可以使用java.util.Calendar并为其设置日期来解决此问题。

然后您需要将其转换为java.sql.Date以匹配查询语法

  1. 查询实体列表而不是对象[]

我设法使用以下查询从查询​​中直接获取列表(无需手动迭代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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM