L'objectif est de récupérer des informations à partir d'une table secondaire pour compléter les données d'une liste paginée. Spécifiquement, le champ preWarningIsUpload nécessite une requête supplémentaire pour déterminer s'il doit être vrai ou faux.
Préparation des données pour la requête
Pour interroger la table secondaire, nous devons construire une liste de maps. Chaque map cotniendra les clés incidentId et incidentType pour identifier les enregistrements pertinents.
/**
* Crée une table Guava pour mapper les identifiants d'incident et de type à l'ID du feedback.
* Cette table est utilisée pour vérifier rapidement si un enregistrement de feedback existe.
*
* @param exceedResults La liste des résultats d'incident excédentaires.
* @return Une table où les clés sont l'incidentId, l'incidentType et la valeur est l'ID du feedback.
*/
public Table<String, String, String> buildFeedbackIdTable(List<AgendaExceedResult> exceedResults) {
if (exceedResults == null || exceedResults.isEmpty()) {
return HashBasedTable.create();
}
List<Map<String, String>> queryParamsList = new ArrayList<>();
exceedResults.forEach(result -> {
Map<String, String> params = new HashMap<>();
params.put("incidentId", result.getIncidentId());
params.put("incidentType", result.getAlarmType());
queryParamsList.add(params);
});
List<MaintenanceFeedbackResult> feedbackResults = maintenanceFeedbackMapper.findFeedbackByIdAndType(queryParamsList);
Table<String, String, String> feedbackTable = HashBasedTable.create();
feedbackResults.forEach(feedback -> feedbackTable.put(feedback.getIncidentId(), feedback.getIncidentType(), feedback.getId()));
return feedbackTable;
}
Requête groupée pour récupérer les données
Une requête SQL est utilisée pour rechercher en masse les enregistrements de maintenance basés sur les paires incidentId et incidentType préparées précédemment.
/**
* Interroge la base de données pour récupérer les enregistrements de maintenance
* correspondant à une liste de paires incidentId et incidentType.
*
* @param conditions Une liste de maps, chaque map contenant 'incidentId' et 'incidentType'.
* @return Une liste d'enregistrements de maintenance trouvés.
*/
List<MaintenanceFeedbackResult> findFeedbackByIdAndType(@Param("conditions") List<Map<String, String>> conditions);
<!-- dans le mapper XML -->
<select id="findFeedbackByIdAndType" resultType="com.yourpackage.MaintenanceFeedbackResult">
SELECT * FROM d_maintenance_feedback_result
<where>
<if test='conditions != null and !conditions.isEmpty()'>
AND (incident_id, incident_type) IN
<foreach item="condition" index="index" collection="conditions" open="(" separator="," close=")">
(#{condition.incidentId}, #{condition.incidentType})
</foreach>
</if>
AND is_delete = 0
</where>
</select>
Intégration des résultats dans la réponse
Les données récupérées sont stockées dans une table Guava (HashBasedTable). Cette structure permet d'accéder efficacement à l'ID du feedback en utilisant à la fois l'ID de l'incident et son type. Ensuite, la liste de résultats paginée est parcourue pour y ajouter l'information de téléversement.
/**
* Remplit le statut de téléversement du fichier de feedback pour chaque élément de la liste de résultats.
*
* @param pageList La liste originale des résultats d'incident excédentaires.
* @param resultList La liste des objets de réponse à peupler.
*/
private void populateFeedbackUploadStatus(List<AgendaExceedResult> pageList, List<AgendaExceedPageResVo> resultList) {
if (pageList == null || pageList.isEmpty()) {
return;
}
Table<String, String, String> feedbackTable = buildFeedbackIdTable(pageList);
resultList.forEach(item -> {
String currentIncidentId = item.getIncidentId();
String currentIncidentType = item.getIncidentType();
String feedbackId = feedbackTable.get(currentIncidentId, currentIncidentType);
// Assigne la valeur booléenne basée sur la présence d'un feedbackId
if ("0".equals(currentIncidentType)) { // Exemple pour le type zéro
item.setPreWarningIsUpload(feedbackId != null);
} else if ("1".equals(currentIncidentType)) { // Exemple pour le type un
item.setFirstLevelIsUpload(feedbackId != null);
} else { // Gère les autres types
item.setSecondLevelIsUpload(feedbackId != null);
}
});
}
Optimisation de la préparation des données
Il est recommandé d'utiliser un Set de beans personnalisés (qui implémentent hashCode() et equals()) au lieu d'une List<Map<String, String>> pour la préparation des paramètres de requête. L'utilisation d'un Set assure l'unicité des paires d'identifiants et évite les doublons avant l'envoi à la base de données.