Hibernate 通用 DAO 搜索

Posted

技术标签:

【中文标题】Hibernate 通用 DAO 搜索【英文标题】:Hibernate generic DAO search 【发布时间】:2012-03-15 04:29:14 【问题描述】:

我正在使用hibernate generic dao project。我需要搜索“date1”字段早于“date2”的所有记录,例如:

search.addFilterLessThan('date1', 'date2');

但是从 API 看来,搜索只接受值作为第二个参数,而不接受属性:

Date date = ...;
search.addFilterLessThan('date1', date);

有没有办法根据两个记录字段进行过滤?

【问题讨论】:

【参考方案1】:

我假设您使用的是 Hibernate 标准 API。如果是,比较属性很容易:

Criteria criteria = session.createCriteria(SomeObject.class);
criteria.add(Property.forName("date1").ltProperty("date2"));
criteria.list();

您还可以跨连接和 SQL 支持的各种其他场景进行比较。这种事情也可以通过 HQL 获得。

审核 Hibernate Generic DAO 项目后更新:

看起来 Hibernate Generic DAO 项目在休眠功能方面束缚了您的双手,限制了可能的查询种类(不公开 Criteria 或 HQL 查询!)。我不认为这是增值,即使声称它“简化”了您的查询或使它们更“强大”。

【讨论】:

我正在使用 hibernate-generic-dao 的 Search 和 Filter 类,为了与项目的其余部分保持一致,我更愿意使用它们。如果我无法通过这些课程达到我所需要的,我将使用标准 哇,这个框架真的束缚了你的手,而且不是很好。看起来不可能使用包装“hibernate-generic-dao”项目及其搜索或过滤器类来进行这种类型的搜索。我会把它撕掉,要么编写你自己的 DAO,要么为你自己的项目创建一个更好、更灵活/限制更少的“通用 dao”。 此外,原始开发人员不再支持该特定项目。 在我的工作中,我们创建了一个类似的“通用 DAO”实现,但我们确保允许任何调用代码访问休眠会话,允许开发人员创建任何可以想象的查询,包括 HQL 和标准查询. 不再支持查看该项目我想当有更多可用时间时我们也必须这样做。也许扩展框架以允许标准搜索将在短期内起作用【参考方案2】:

从项目组得到答案,它是使用自定义过滤器完成的:

search.addFilterCustom("date1 < date2"); 

【讨论】:

以上是关于Hibernate 通用 DAO 搜索的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 通用 dao 重载 removeById

Spring 3,带有通用 DAO 的 Hibernate 4 AutoWired sessionFactory

在通用 DAO 中使用 Hibernate 调用存储过程的最佳方法是啥?

为 Hibernate 创建一个通用的 DAO 类

Hibernate Dao映射配置通用接口类反射获取加载calass实例

通用Hibernate-Dao