pureQuery가 하나의 행만 리턴될 것으로 판별하는 경우, FETCH FIRST ROW ONLY절을 추가하거나 SELECT문을 SELECT-INTO문으로 변경하여 쿼리를 최적화하도록 선택할 수 있습니다.
Data 인터페이스는 세 가지 양식의 queryFirst() 메소드를 제공합니다.
다음 코드는 average_edlevel 및 workdept 키가 있는 단일 Map을 작성합니다. 코드는 REPORTDEPT의 값을 전달하여 관심 부서를 식별합니다.
Connection con = DriverManager.getConnection(...); Data db = DataFactory.getData(con); String reportDept = "B01"; Map<String, Object> edLevelReport = db.queryFirst( "SELECT AVG(EDLEVEL) AS AVERAGE_EDLEVEL, WORKDEPT" + " FROM SAMPLE_SCHEMA.EMP WHERE WORKDEPT = ?" + " GROUP BY WORKDEPT HAVING COUNT(*) > 3", reportDept );
Map 대신에 기존 클래스의 인스턴스를 리턴하는 queryFirst() 메소드의 다른 두 양식 중 하나를 사용할 수 있습니다.
예를 들어, com.company.Employee 클래스의 정보를 리턴하는 것으로 충분할 수 있습니다. 이 Bean에는 관심있는 두 가지 항목의 정보를 저장할 수 있는 등록 정보가 있습니다. 그러나 모든 Bean의 등록 정보 값을 제공하지 않으려는 경우 Employee Bean을 채우는 것은 바람직하지 않습니다.
또는 새 Java™ 오브젝트를 가능한 한 필수 정보를 그대로 저장할 수 있는 private 클래스로 저장할 수 있습니다. 이는 자체 문서화하는 지우기 코드를 제공하므로 많은 상황에서 최선의 해결책이 될 수 있습니다. 그러나 이 해결책은 이 새 클래스의 인스턴스를 처리하기 위해 추가 응용프로그램 논리를 필요로 합니다(예를 들어, 컨텐츠를 스프레드시트에 입력하거나 컨텐츠를 XML 문서에 보냄).
public Employee { @Column(name="EMPNO") public String employeeId; @Column(name="FIRSTNME") public String firstName; @Column(name="MIDINIT") public String middleInitial; public String lastName; @Column(name="WORKDEPT") public String departmentId; @Column(name="PHONENO") public String extension; public Date hireDate; }
Connection con = DriverManager.getConnection(...); Data db = DataFactory.getData(con); String managerEmp = "000070"; com.company.Employee empData = db.queryFirst( "SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT," + " PHONENO, HIREDATE FROM HRDept.Employee" + " WHERE EMPNO = ?", Employee.class, managerEmp );