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

     2023-02-26     203

关键词:

【中文标题】在 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在spring boot中实现分页

】如何使用hibernate在springboot中实现分页【英文标题】:Howtoimplementpaginationinspringbootwithhibernate【发布时间】:2015-12-0217:41:44【问题描述】:我正在使用带有休眠功能的SpringBoot,并且我想在我的项目中使用分页。我在谷歌上搜索并... 查看详情

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

】使用SwiftUI在WatchOS中实现从主控制器导航到基于页面的控制器的问题【英文标题】:IssuesimplementingnavigationfromamaincontrollertopagebasedcontrollersinWatchOSusingSwiftUI【发布时间】:2019-10-2417:39:55【问题描述】:我正在尝试使用SwiftUI做类似... 查看详情

在 Rails 4 中实现通用搜索

】在Rails4中实现通用搜索【英文标题】:ImplementingUniversalsearchinrails4【发布时间】:2015-05-1219:32:29【问题描述】:我有一个带有多个模型和视图页面的rails4应用程序。我的应用程序的应用程序布局包含一个搜索栏。但它目前处于... 查看详情

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

】如何在使用Hibernate映射的类中实现toString()?【英文标题】:HowdoIimplementtoString()inaclassthatismappedwithHibernate?【发布时间】:2009-11-1213:01:06【问题描述】:我有一个从Hibernate会话中获得的类的实例。那个会议早就过去了。现在,我... 查看详情

java示例代码_在jpa/hibernate中实现这个简单的关联

java示例代码_在jpa/hibernate中实现这个简单的关联 查看详情

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

】如何在hibernate中实现对两个表的查询数据?【英文标题】:howtoimplementquerydataontwotablesinhibernate?【发布时间】:2012-06-1502:48:24【问题描述】:如何在hibernate中实现这个查询?selecttab1.namefromtable1tab1,table2tab2wheretable1.id=table2.id【问... 查看详情

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

】尝试在wordpress自定义页面中实现jQuery以进行搜索自动完成但不工作【英文标题】:TryingtoimplementjQueryinwordpresscustompageforsearchautocompletebutisnotworking【发布时间】:2017-04-1818:55:01【问题描述】:大家好,我刚开始开发网站,我是word... 查看详情

java示例代码_关于如何在Spring应用程序中实现Hibernate DAO的一些疑问

java示例代码_关于如何在Spring应用程序中实现Hibernate DAO的一些疑问 查看详情

android中实现模拟搜索的功能详解

​先看效果图,合适了再接着往下看:我们看到的这个页面,是由两部分组成,顶部的自定义的搜索框,和listView组成。首先我们来实现布局页面,自定义搜索框,和设置listView<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:andr... 查看详情

如何在java中实现自动生成html

我现在在制作java毕业项目,一个新闻发布系统.用hibernate+struts做的想要实现用户游览新闻的时候,游览的是静态页面.但是如何让新闻发布人员发布新闻后生成静态页面?是在保存到数据库的时候,还是在查询新闻的时候?参考技术A自... 查看详情

Vue.js:在 laravel 中实现 MPA(多页面应用程序)的最佳方式

】Vue.js:在laravel中实现MPA(多页面应用程序)的最佳方式【英文标题】:Vue.js:BestwaytoimplementMPA(Multipageapp)inlaravel【发布时间】:2018-06-2218:16:16【问题描述】:我已经四处寻找了很长一段时间,但没有得到任何召集。在laravel中实... 查看详情

在 NHibernate 查询中实现条件的更好方法是啥?

】在NHibernate查询中实现条件的更好方法是啥?【英文标题】:What\'sthebetterwaytoimplementaconditionatNHibernatequery?在NHibernate查询中实现条件的更好方法是什么?【发布时间】:2019-03-2713:22:44【问题描述】:我正在使用NHibernate的Query的泛... 查看详情

如何在 Spring Security 中实现基于 JWT 的身份验证和授权

】如何在SpringSecurity中实现基于JWT的身份验证和授权【英文标题】:HowtoimplementJWTbasedauthenticationandauthorizationinSpringSecurity【发布时间】:2018-08-2519:30:37【问题描述】:如何在SpringSecurity中实现基于JWT的认证和授权我正在尝试在我的... 查看详情

如何在hibernate中实现继承?

】如何在hibernate中实现继承?【英文标题】:howtoimplementinheritanceinhibernate?【发布时间】:2010-06-0506:35:33【问题描述】:我有一个实体:BaseEntity-->其中包含用户登录信息,如createdBy、createdTime、EditedBy、editedTimeEmployee-->其中包... 查看详情

在 reactjs 中实现基于 INTERFACE 的功能以基于变量呈现组件

】在reactjs中实现基于INTERFACE的功能以基于变量呈现组件【英文标题】:ImplementINTERFACEbasedfunctionalityinreactjstorendercomponentbasedonvariable【发布时间】:2022-01-2020:28:22【问题描述】:如何使用基于界面的功能来根据选项卡选择呈现组件... 查看详情

java示例代码_在Hibernate中实现这个查询

java示例代码_在Hibernate中实现这个查询 查看详情

react中实现keepalive组件缓存效果(代码片段)

背景:由于react官方并没有提供缓存组件相关的api(类似vue中的keepalive),在某些场景,会使得页面交互性变的很差,比如在有搜索条件的表格页面,点击某一条数据跳转到详情页面,再返回表格页... 查看详情

在 Swift 中实现搜索栏

】在Swift中实现搜索栏【英文标题】:ImplementingSearchBarinSwift【发布时间】:2014-08-1814:23:40【问题描述】:我一直在尝试在我的表格视图中实现一个搜索栏,以允许用户搜索事务名称。这是我正在学习的教程:http://www.appcoda.com/sear... 查看详情