在 Hibernate 中实现基于条件的搜索页面的优雅方式

Posted

技术标签:

【中文标题】在 Hibernate 中实现基于条件的搜索页面的优雅方式【英文标题】:Elegant way to implement a criteria-based search page in Hibernate 【发布时间】:2011-04-23 01:29:41 【问题描述】:

使用 Hibernate,您将如何设计和实现搜索条件页面(该页面具有多个可编辑/可选字段/下拉菜单作为搜索条件),这样查询不应使数据访问器代码混乱。我的意思是没有基于条件的查询字符串连接,最终所有查询都应该放在一个单独的 xml 文件中。我已经使用 IBatis 的动态查询完成了这样的实现。在 Hibernate 中找不到这样的东西,所以我开始思考在 hibernate 中实现基于动态标准的页面的优雅方法是什么。

【问题讨论】:

就性能而言,我相信在 IBatis 中实现标准可以更好(更干净)。 Hibernate 并没有那么干净地解决这个问题,但由于它至少努力提供一个 API 来做到这一点,我会接受答案 【参考方案1】:

毫无疑问,听起来您正在寻找Criteria API:

http://docs.jboss.org/hibernate/core/3.5/reference/en/html/querycriteria.html

【讨论】:

是的,这正是 OP 要求的 +1【参考方案2】:

我赞同 Affe 的建议,Criteria API 正是您正在寻找的,并且在处理动态查询时被推荐。我在下面引用的Hibernate Querying 102 : Criteria API 很好地说明了这一点:

使用休眠标准 API

Hibernate Criteria API 提供了一个 优雅的即时构建方式 Hibernate-persisted 上的动态查询 数据库。使用这种技术, 前面的 24 行示例可以编码 更简洁,更清楚地使用 仅仅 8 行代码:

Criteria criteria = session.createCriteria(Sale.class);
if (startDate != null) 
  criteria.add(Expression.ge("date",startDate);

if (endDate != null) 
  criteria.add(Expression.le("date",endDate);

List results = criteria.list();

我们来看看使用 Hibernate Criteria API 更详细。

文章中显示的代码不言自明,请看一下。

相关问题

Hibernate: Criteria vs. HQL

资源

Hibernate Querying 102 : Criteria API Hibernate Criteria API: Multi-Criteria Search Made Easy

【讨论】:

【参考方案3】:

因为我有同样的问题,我开发了一个通用 Dao 类,它允许动态(使用反射)根据分配给对象的值创建条件并查询数据库

例如 国家/地区=新国家/地区(); // 这些值可以说它们是根据用户帖子在您的 servlet 上分配的 country.setName("卢森堡");

        // This is where your service layer starts. It gets as a param the Country object
        GenericDaoDB gDaoDB = new GenericDaoDB();

        try
            List resultList = gDaoDB.list(country);
            System.out.println("=========Result Print==============");
            for(int i=0; i<resultList.size();i++)
                 Country resultCountry = (Country)resultList.get(i);
                 System.out.println("Name:"+ resultCountry.getName()+"  Country Code:"+resultCountry.getCountryCode());
             
        catch(BasisException e)
            e.printStackTrace();
        

如果您喜欢查看http://sourceforge.net/apps/wordpress/jprovocateur/2010/09/23/simple-example-hibernate-query-the-database-without-hql-or-criteria/,您可以在其中找到更多详细信息和示例项目。

因为它是一个通用类,你可以将它用于你所有的 Pojos

【讨论】:

以上是关于在 Hibernate 中实现基于条件的搜索页面的优雅方式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用hibernate在spring boot中实现分页

尝试在 wordpress 自定义页面中实现 jQuery 以进行搜索自动完成但不工作

在 Rails 4 中实现通用搜索

使用 SwiftUI 在 WatchOS 中实现从主控制器导航到基于页面的控制器的问题

如何在使用 Hibernate 映射的类中实现 toString()?

如何在hibernate中实现对两个表的查询数据?