【问题标题】:Hibernate Criteria: How to create a query for many search fields?Hibernate Criteria:如何为多个搜索字段创建查询?
【发布时间】:2014-10-18 05:16:59
【问题描述】:

如果输入任何字段,我需要从数据库中获取详细信息,字段如下

  1. 日期

  2. 代码

  3. 动作

  4. 状态

  5. 用户名

  6. 应用程序。

请帮助我,因为可以输入任何字段,但不一定需要输入所有值。

感谢和问候, 杰弗

【问题讨论】:

  • 只需在 select 中放一个 where 即可获取不为 null 或不为空的字段。
  • 可以使用标准吗?如果是这样,你能给我看看样品吗?
  • @user3751955 是的 Crietria API 可以使用,示例发布为答案,供您接受。

标签: hibernate hql hibernate-criteria


【解决方案1】:

HQL VS Criteria API - 性能

HQLCriteriaQuery 在性能方面存在差异,每次使用条件查询触发查询时,it creates a new alias for the table 名称不会反映在任何数据库的最后查询缓存中。这会导致编译生成的 SQL 的开销,需要更多时间来执行。

Criteria 尊重映射中的惰性设置,并保证加载您想要加载的内容。这意味着一个 Criteria 查询可能会导致几个 SQL 立即 SELECT 语句来获取具有所有非延迟映射关联和集合的子图。如果要更改“如何”甚至“内容”,请使用 setFetchMode() 启用或禁用特定集合或关联的外部联接获取。条件查询也完全尊重获取策略(join vs select vs subselect)。

HQL 尊重映射中的惰性设置,并保证加载您想要加载的内容。这意味着一个 HQL 查询可能会导致多个 SQL 立即 SELECT 语句来获取具有所有非延迟映射关联和集合的子图。如果要更改“如何”甚至“什么”,请使用 LEFT JOIN FETCH 为特定集合或可为空的多对一或一对一关联启用外连接提取,或使用 JOIN FETCH 启用内部连接获取不可为空的多对一或一对一关联。 HQL 查询不遵守映射文档中定义的任何 fetch="join"。

【讨论】:

    【解决方案2】:

    您可以简单地测试以下字段是否不为空或为空,如果不为空或为空添加限制。例如。

        //assuming you have Person.class
        Criteria cr = session.createCriteria(Person.class);
    
       //prevent to add restrictions if date is null
        if(date !=null)
        cr.add(Restrictions.eq("date", date));
    
    
        if(!username.equals(""))
        cr.add(Restrictions.eq("userName"),username);
        //test other fields
    
        List results = cr.list();
    
        //return results
    

    了解更多基本信息。您可以查看this

    【讨论】:

      【解决方案3】:

      标准不适合这种情况。我建议你动态构建 HQL!

      【讨论】:

      • 请提供样品
      【解决方案4】:
      public List searchAccommodation(Date startDate, Date endDate, Country country, AccommodationType type, Integer capacity)
          Criteria criteria = session.createCriteria(Accommodation.class);
      
          if (startDate != null) {
              criteria.add(Expression.ge("availabilityDate",startDate);
          }                
          if (endDate != null) {
              criteria.add(Expression.le("availabilityDate",endDate);
          }                
          if (country != null) {
                criteria.add(Expression.eq("country",country);
          }                
          if (capacity != null) {
                criteria.add(Expression.ge("capacity",capacity);
          }                
          if (type != null) {
                criteria.add(Expression.eq("type",type);
          }                
          List results = criteria.list();
          //
          // Execute the query
          //
          return query.list();
      }
      

      【讨论】:

      • @user3751955 发布您遇到的错误,您使用的是哪个版本的休眠
      • @user3751955 所以请接受我的回答以提高您的评分
      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 2020-04-26
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多