OGNL投影查询

三、语法细节

1.查询属于depart01的全部Employee

Java代码:

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

List<Employee> empList = (List<Employee>) Ognl.getValue("empList", department);

 

for (Employee employee : empList) {

 

System.out.println(employee.getEmpName()+" "+employee.getSalary());

 

}

 

执行结果:

emp01 100.0

emp02 200.0

emp03 300.0

emp04 400.0

注:这里暂时还没有用到投影和过滤。

2.在1的基础上仅查询员工工资

Java代码

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

List<Double> salaryList = (List<Double>) Ognl.getValue("empList.{salary}", department);

 

for (Double salary : salaryList) {

System.out.println("salary="+salary);

}

 

 

执行结果

salary=100.0

salary=200.0

salary=300.0

salary=400.0

说明:这里面的OGNL表达式empList.{salary}就是用到了投影,在整个List集合中仅获取每个元素对象的某一个属性值。

3.查询部门depart01中工资大于150的员工信息

Java代码

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

String ognl = "empList.{?#this.salary>150}";

 

List<Employee> empList = (List<Employee>) Ognl.getValue(ognl, department);

for (Employee employee : empList) {

System.out.println(employee.getEmpName()+" "+employee.getSalary());

}

 

执行结果

emp02 200.0

emp03 300.0

emp04 400.0

说明:这里OGNL表达式empList.{?#this.salary>150}表示从empList集合中查询工资大于150的员工。其中?表示返回查询结果中的全部数据,相应的使用^符号可以返回查询结果中的第一条数据,$符号表示返回最后一条数据。

#后面跟过滤条件。

this表示遍历集合得到的每一个元素对象,这里是Employee对象。

4.查询部门depart01中工资大于150的员工中的第一条信息

Java代码

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

String ognl = "empList.{^#this.salary>150}";

 

List<Employee> empList = (List<Employee>) Ognl.getValue(ognl, department);

for (Employee employee : empList) {

System.out.println(employee.getEmpName()+" "+employee.getSalary());

}

 

执行结果

emp02 200.0

说明:与3中的例子唯一的区别是,这里使用^符号表示取查询结果中的第一条数据。

这里需要格外强调的是,即使只取一条数据,返回的结果仍然是集合,而不是单个对象,大家一定要注意!

5.查询部门depart01中工资大于150的员工中的最后一条信息

Java代码

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

String ognl = "empList.{$#this.salary>150}";

 

List<Employee> empList = (List<Employee>) Ognl.getValue(ognl, department);

for (Employee employee : empList) {

System.out.println(employee.getEmpName()+" "+employee.getSalary());

}

 

执行结果

emp04 400.0

说明:与3中的例子唯一的区别是,这里使用$符号表示取查询结果中的最后一条数据,返回结果仍然是集合。

6.在工资大于150的员工信息中读取第二条数据

Java代码

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

String ognl = "empList.{?#this.salary>150}[1]";

 

Employee employee = (Employee) Ognl.getValue(ognl, department);

System.out.println(employee.getEmpName()+" "+employee.getSalary());

 

执行结果

emp03 300.0

说明:由于过滤的结果是一个List集合,所以通过下标指定一个索引后,最终获取到的是一个Employee对象。

7.在工资大于150的员工信息中投影全部工资数据

Java代码

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

String ognl = "empList.{?#this.salary>150}.{salary}";

 

List<Double> salaryList = (List<Double>) Ognl.getValue(ognl, department);

for (Double salary : salaryList) {

System.out.println("salary="+salary);

}

 

执行结果

salary=200.0

salary=300.0

salary=400.0

说明:这里针对过滤得到的集合进行了一次投影,得到了一个salary的值组成的新的集合

8.查询工资等于300的员工的地址数据

Java代码

List<Department> departList = GetData.getDepartList();

 

Department department = departList.get(0);

 

String ognl = "empList.{?#this.salary==300}[0].address";

 

Address address = (Address) Ognl.getValue(ognl, department);

System.out.println(address);

 

执行结果

Address [country=country03, province=prov03, city=city03, street=street03]

说明:过滤的结果是Employee的List集合,用[0]找到集合中的唯一一个Employee对象,再访问这个Employee对象的address属性,得到的就是Address对象。