Exécution d'une requête complexe afin de produire une liste d'objets

Cet exemple vous explique comment vous pouvez utiliser pureQuery pour rechercher le projet comptant le plus grand nombre de membres du personnel dans une société.

Définition de la table de base de données et du bean correspondant

Cet exemple utilise la définition simple suivante d'une table appelée 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))

Un bean correspondant à cette table peut se présenter comme suit.

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; }
}

Si un bean doit être créé automatiquement à partir des résultats d'une requête, vous devez utiliser l'annotation @Column lorsque le nom d'une colonne d'un objet de la base de données ne correspond pas au nom de la propriété correspondant d'un bean.

Style de programmation de méthode annotée

Lorsque vous utilisez des méthodes annotées pour manipuler un objet de base de données, vous devez définir une interface définissant ces méthodes, utiliser le générateur pureQuery pour générer une implémentation de cette interface, puis écrire une application appelant les méthodes se trouvant dans la classe d'implémentation.

Vous pouvez écrire une interface contenant une routine générant des rapports pour les project nécessitant le plus grand nombre de membres du personnel.

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();
}

Une fois que vous avez généré une implémentation de l'interface projectStaffing et que vous avez renseigné la table PROJ, vous pouvez rechercher le plus grand projet en terme de personnel contenant un code se présentant comme suit :

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() );
}

Style de programmation intégrée

Si vous souhaitez que l'instruction SELECT de la génération de rapports pour les projets nécessitant le plus de personnel soit visible dans la source de l'application, vous pouvez utiliser le style de programmation intégrée.

Dans votre application, vous appelez une version de la méthode queryList() surchargée définie dans une implémentation de l'interface Data.

Votre application peut se présenter comme suit :

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() );
}

Commentaires