Java 如何在hibernate查询中将嵌套属性用作命名参数?

Java 如何在hibernate查询中将嵌套属性用作命名参数?,java,sql,hibernate,parameters,param,Java,Sql,Hibernate,Parameters,Param,我确实希望在hibernate查询中使用嵌套属性作为命名参数。 所以我可以更优雅地维护我的param bean 例如,我想编写我的HQL,如下所示: "...... where employee.age >= :age.min and employee.age <= :age.max and employee.name = :name" "...... where employee.age >= :ageMin and em

我确实希望在hibernate查询中使用嵌套属性作为命名参数。 所以我可以更优雅地维护我的param bean

例如,我想编写我的HQL,如下所示:

"......
where
    employee.age >= :age.min
  and
    employee.age <= :age.max
  and
    employee.name = :name"
"......
where
    employee.age >= :ageMin
  and
    employee.age <= :ageMax
  and
    employee.name = :name"
它使用参数bean上的getter方法,因此无法检索嵌套属性

为了访问嵌套属性,我必须在param bean中创建大量委托方法:

public int getAgeMin() {
    return this.age.getMin();
}


public int getAgeMax() {
    return this.age.getMax();
}
并编写HQL,如下所示:

"......
where
    employee.age >= :age.min
  and
    employee.age <= :age.max
  and
    employee.name = :name"
"......
where
    employee.age >= :ageMin
  and
    employee.age <= :ageMax
  and
    employee.name = :name"
“。。。。。。
哪里
employee.age>=:ageMin
和
employee.age=:年龄\分钟
和
employee.age不如改用:

这与嵌套过滤参数非常接近。

我为什么需要它

  • 这不仅是“选择”的问题,而且也发生在 “删除”、“更新”

  • 如果我需要编写一个非常复杂的查询,我更喜欢HQL,但不喜欢 标准

  • 嵌套参数Bean/嵌套属性使我能够维护 param bean更优雅。例如,我有一个类: [ValueRange>],它有4个属性:

  • 公共类ValueRange{
    私家侦探;
    私有布尔includeMin;
    私人T最大值;
    私有布尔includeMax;
    .....
    }
    
    我喜欢使用这个容器Bean来表示所有ValueRange条件,比如:

    where
    ....
        employee.birthDate >= :dateRange.min
      and
        employee.birthDate <= :dateRange.max
    ....
        employee.salary >= :salaryRange.min
      and
        employee.salary <= :salaryRange.max
    
    在哪里
    ....
    employee.birthDate>=:dateRange.min
    和
    employee.birthDate=:salaryRange.min
    和
    员工工资
    
    Age age = ...;
    Employee employee = new Employee();
    employee.setAge(age);
    Example example = Example.create(employee);             
    List results = session.createCriteria(Employee.class)
        .add(example)
        .list();
    
    public class ValueRange<T extends Comparable<T>> {
      private T min;
    
      private boolean includeMin;
    
      private T max;
    
      private boolean includeMax;
    
    .....
    }
    
    where
    ....
        employee.birthDate >= :dateRange.min
      and
        employee.birthDate <= :dateRange.max
    ....
        employee.salary >= :salaryRange.min
      and
        employee.salary <= :salaryRange.max
    
    where
    ....
        employee.birthDate >= :dateRange.min
      and
        employee.birthDate <= :dateRange.max
    ....
        employee.salary >= :salaryRange.min
      and
        employee.salary <= :salaryRange.max
    ....
        employee.department.code = :department.code
    and
        employee.department.name = :department.name