描述: 在平常的开发过程中,会发现日期的类型有许多种,有java.lang.Date,java.sql.Date,oracle.jbo.domain.Date,还有时间戳oracle.jbo.domain.Timestamp等等。经常也会遇到这些类型之间的相互转化。本次讲述日期字符串转化为oracle.jbo.domain.Date与oracle.jbo.domain.Timestamp的类型。
需求: 在xe数据库中的employees表中找出雇佣日期(hire_date)在某个时间(自己定义)之前,并且职位编号(job_id)只属于('AD_PRES', 'AD_VP', 'IT_PROG')三种类型的员工。
实现:
单纯用sql语句去查询很简单,例如。
select * from employees where job_id in ('AD_PRES', 'AD_VP', 'IT_PROG') and hire_date <= to_date('1992/1/1', 'yyyy/dd/mm')
这里为了更好地讲述问题,采用建立子查询的方式去查询符合条件的员工。
1. 基于表Employees,建立EmployeesEO,EmployeesVO。在EmployeesVO中建立一个子查询,用来查询符合条件的员工。首先在vo上面建立一个绑定变量。
2. 然后再vo中建立子查询EmployeesVC,并且HireDate属性绑定到上面建立的绑定变量bvHireDate上。
3. 创建jspx页面,SearchEmployees.jspx,布局大概如下
4. 产生对应backingBean,SearchEmployees类,把search的action绑定到SearchAction方法上,处理查询逻辑。首先把界面上的inputDate组件绑定到backingBean中,一边在后台取出界面上输入的值,然后把得到的字符串日期,转化为oracle.jbo.domain.Date或者oracle.jbo.domain.Timestamp类型。
首先在backingBean的SearchEmployees类中编写
public class SearchEmployees extends CustomManagerBean { private RichInputDate inputDate; public SearchEmployees() { } public void setInputDate(RichInputDate inputDate) { this.inputDate = inputDate; } public RichInputDate getInputDate() { return inputDate; } public String searchAction() { String inDate = this.getInputDate().getValue().toString(); System.out.println(inDate); DateFormat formatter; java.util.Date date = null; Timestamp time = null; try { formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); date = formatter.parse(inDate); time = new Timestamp(date.getTime()); System.out.println(time); } catch (ParseException e) { e.printStackTrace(); } OperationBinding binding = this.findOperation("search"); binding.getParamsMap().put("time", time); binding.execute(); return null; } }
在AM的实现类中实现search方法
public void search(Timestamp time) { EmployeesVOImpl vo = (EmployeesVOImpl)this.getEmployeesVO1(); vo.setbvHireDate(time); ViewCriteria vc = vo.getViewCriteria("EmployeesVC"); vo.applyViewCriteria(vc); vo.executeQuery(); }
5. 运行结果