複雑な照会を実行してオブジェクト・リストを生成する

以下の例は、pureQuery を使用して会社内で最も多いスタッフ・メンバーが含まれるプロジェクトを検索する方法を示しています。

データベース表と対応する Bean の定義

この例では、以下のような HRDEPT.PROJ という簡単な表の定義が使用されます。

CREATE TABLE SAMPLE_SCHEMA.PROJ
  (PROJNO CHAR(6) PRIMARY KEY NOT NULL,
   PROJNAME VARCHAR(24),
   DEPTNO CHAR(3),
   RESPEMP CHAR(6),
   PRSTAFF DECIMAL(5, 2),
   PRSTDATE DATE,
   PRENDATE DATE,
   MAJPROJ CHAR(6))

この表に対応する Bean は以下のようになります。

public class DeptProject {
    private String projectId;
    private String projectName;
    private String owningDepartment;
    private String owningEmployee;
    private BigDecimal avgStaffLevel;
    private Date startDate;
    private Date endDate;
    private String containingProject;

  @Column(name="PROJNO")
  public String getProjectId()
    { return this.projectId; }

  @Column(name="PROJNAME")
  public String getProjectName()
    { return this.projectName; }

  @Column(name="DEPTNO")
  public String getOwningDepartment()
    { return this.owningDepartment; }

  @Column(name="RESPEMP")
  public String getOwningEmployee()
    { return this.owningEmployee; }

  @Column(name="PRSTAFF")
  public BigDecimal getAvgStaffLevel()
    { return this.avgStaffLevel; }

  @Column(name="PRSTDATE")
  public Date getStartDate()
    { return this.startDate; }

  @Column(name="PRENDATE")
  public Date getEndDate()
    { return this.endDate; }

  @Column(name="MAJPROJ")
  public String getContainingProject()
    { return this.containingProject; }

  public void setProjectId(String pi)
    { this.projectId = pi; }
  public void setProjectName(String pn)
    { this.projectName = pn; }
  public void setOwningDepartment(String od)
    { this.owningDepartment = od; }
  public void setOwningEmployee(String oe)
    { this.owningEmployee = oe; }
  public void setAvgStaffLevel(BigDecimal asl)
    { this.avgStaffLevel = asl; }
  public void setStartDate(Date sd)
    { this.startDate = sd; }
  public void setEndDate(Date ed)
    { this.endDate = ed; }
  public void setContainingProject(String cp)
    { this.containingProject = cp; }
}

Bean が照会の結果から自動的にビルドされる場合、データベース・オブジェクトの列名が Bean 内の対応するプロパティーの名前と一致しなければ、@Column アノテーションを使用する必要があります。

アノテーション付きメソッド・プログラミング・スタイル

アノテーション付きメソッドを使用してデータベース・オブジェクトを操作する場合、それらのメソッドを定義するインターフェースを定義し、pureQuery ジェネレーターを使用してそのインターフェースのインプリメンテーションを生成してから、インプリメンテーション・クラスにあるそれらのメソッドを呼び出すアプリケーションを作成する必要があります。

最も多くのスタッフ・メンバーを必要とするプロジェクトを報告するルーチンを含むインターフェースを書くことができます。

public interface projectStaffing 
{
@Select(sql="SELECT * FROM SAMPLE_SCHEMA.PROJ WHERE " +
   "(DAYS(PRENDATE) - DAYS(PRSTDATE)+1) * PRSTAFF = (" +
   "  SELECT MAX((DAYS(PRENDATE) - DAYS(PRSTDATE)+1) * " + 
   "      PRSTAFF) FROM SAMPLE_SCHEMA.PROJ ) " +
   " ORDER BY PRENDATE ")
  public List<DeptProject> biggestProject();
}

projectStaffing インターフェースのインプリメンテーションを生成して PROJ 表にデータをキャプチャーした後、以下のようなコードを使用して、スタッフの観点から最も大きなプロジェクトを検索することができます。

Connection con = DriverManager.getConnection(...);
projectStaffing pM =   DataFactory.getData( projectStaffing.class, con );

List<DeptProject> deptList = pM.biggestProject();
for ( DeptProject dProj: deptList ) {
   System.out.println("Name: " + dProj.getProjectName() + 
       " Department: " + dProj.getOwningDepartment() );
}

インライン・プログラミング・スタイル

ハイレベルのスタッフを必要とするプロジェクトを報告するための SELECT ステートメントをアプリケーション・ソースで可視にする場合、インライン・プログラミング・スタイルを使用することができます。

アプリケーションで、Data インターフェースで定義された、多重定義されたバージョンの queryList() メソッドを呼び出します。

アプリケーションは、以下のようになります。

Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);
List<DeptProject> deptList = db.queryList(
 "SELECT * FROM SAMPLE_SCHEMA.PROJ WHERE " +
   "(DAYS(PRENDATE) - DAYS(PRSTDATE)+1) * PRSTAFF = (" +
   "  SELECT MAX((DAYS(PRENDATE) - DAYS(PRSTDATE)+1) * " +
   "      PRSTAFF) FROM SAMPLE_SCHEMA.PROJ ) " +
   " ORDER BY PRENDATE", DeptProject.class );

for ( DeptProject dProj: deptList ) {
   System.out.println("Name: " + dProj.getProjectName() + 
       " Department: " + dProj.getOwningDepartment() );
}

フィードバック