Hibernate Criteria:如何为许多搜索字段创建查询?

时间:2014-08-25 05:17:33

标签: hibernate hql hibernate-criteria

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

  1. 日期

  2. 代码

  3. 操作

  4. 状态

  5. 用户名

  6. 的应用。

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

    谢谢&问候, Jafer

4 个答案:

答案 0 :(得分:0)

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

    //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

答案 1 :(得分:0)

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();
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

HQL VS Criteria API - 性能

每次使用criteriaQuery HQL名称触发查询时,CriteriaQueryit creates a new alias for the table之间的性能存在差异,该名称不会反映在任何数据库的上次查询缓存中。这导致编译生成的SQL的开销,花费更多的时间来执行。

条件尊重映射中的延迟设置,并确保加载要加载的内容。这意味着一个Criteria查询可能会导致多个SQL立即SELECT语句来获取具有所有非延迟映射关联和集合的子图。如果你想改变"怎么"甚至" what",使用setFetchMode()来启用或禁用特定集合或关联的外连接提取。 Criteria查询也完全尊重提取策略(join vs select vs subselect)。

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