Comment ramener les objets associés dans une projection?
Bonjour à tous,
Voici une question que me pose problème depuis un petit moment déjà.
J'ai un objet TauxCouvertureSurExerciceDesSIC qui hérite de TauxCouvertureSurExercice. Voici le code de ces 2 objets :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
| public class TauxCouvertureSurExerciceDesSIC extends TauxCouvertureSurExercice
{
/** Constant : serialVersionUID. */
private static final long serialVersionUID = 1L;
/**
* Instanciation de taux couverture sur exercice des sic.
*/
public TauxCouvertureSurExerciceDesSIC()
{
super();
}
}
public class TauxCouvertureSurExercice extends BaseBean
{
/** Constant : serialVersionUID. */
private static final long serialVersionUID = 1L;
/** id. */
private Long id;
/** version. */
private int version;
/** nb entites a. */
private Long nbEntitesA;
/** nb entites audit programme b. */
private Long nbEntitesAuditProgrammeB;
/** nb entites audit engage c. */
private Long nbEntitesAuditEngageC;
/** est ligne de cumul. */
private Boolean estLigneDeCumul = false;
/** est ligne de total général. */
private Boolean estLigneTotalGeneral = false;
/** numero de ligne. */
private Long numeroDeLigne;
/** le exercice. */
private Exercice leExercice;
/** la categorie entite. */
private CategorieEntite laCategorieEntite;
/** les entites. */
private Set<Entite> lesEntites = new HashSet<Entite>();
/** les entites audit programme. */
private Set<Entite> lesEntitesAuditProgramme = new HashSet<Entite>();
/** les entites engage. */
private Set<Entite> lesEntitesAuditEngage = new HashSet<Entite>();
/** la direction du tcse = nom utilisé pour ne pas avoir de problème de projection. */
private Direction laDirectionDuTCSE;
/**
* Instanciation de taux couverture sur exercice.
*/
public TauxCouvertureSurExercice()
{
super();
}
/**
* Accesseur de l attribut id.
*
* @return id
*/
public Long getId()
{
return id;
}
/**
* Modificateur de l attribut id.
*
* @param id le nouveau id
*/
public void setId(Long id)
{
this.id = id;
}
/**
* Accesseur de l attribut version.
*
* @return version
*/
public int getVersion()
{
return version;
}
/**
* Modificateur de l attribut version.
*
* @param version le nouveau version
*/
public void setVersion(int version)
{
this.version = version;
}
/**
* Accesseur de l attribut nb entites a.
*
* @return nb entites a
*/
public Long getNbEntitesA()
{
return nbEntitesA;
}
/**
* Modificateur de l attribut nb entites a.
*
* @param nbEntitesA le nouveau nb entites a
*/
public void setNbEntitesA(Long nbEntitesA)
{
this.nbEntitesA = nbEntitesA;
}
/**
* Accesseur de l attribut nb entites audit programme b.
*
* @return nb entites audit programme b
*/
public Long getNbEntitesAuditProgrammeB()
{
return nbEntitesAuditProgrammeB;
}
/**
* Modificateur de l attribut nb entites audit programme b.
*
* @param nbEntitesAuditProgrammeB le nouveau nb entites audit programme b
*/
public void setNbEntitesAuditProgrammeB(Long nbEntitesAuditProgrammeB)
{
this.nbEntitesAuditProgrammeB = nbEntitesAuditProgrammeB;
}
/**
* Accesseur de l attribut nb entites audit engage c.
*
* @return nb entites audit engage c
*/
public Long getNbEntitesAuditEngageC()
{
return nbEntitesAuditEngageC;
}
/**
* Modificateur de l attribut nb entites audit engage c.
*
* @param nbEntitesAuditEngageC le nouveau nb entites audit engage c
*/
public void setNbEntitesAuditEngageC(Long nbEntitesAuditEngageC)
{
this.nbEntitesAuditEngageC = nbEntitesAuditEngageC;
}
/**
* Accesseur de l attribut est une ligne de cumul.
*
* @return est une ligne de cumul
*/
public Boolean getEstLigneDeCumul()
{
return estLigneDeCumul;
}
/**
* Modificateur de l attribut est une ligne de cumul.
*
* @param estLigneDeCumul la nouvelle ligne de cumul
*/
public void setEstLigneDeCumul(Boolean estLigneDeCumul)
{
this.estLigneDeCumul = estLigneDeCumul;
}
/**
* Accesseur de l attribut est une ligne ligne de total général.
*
* @return est une ligne de total général
*/
public Boolean getEstLigneTotalGeneral()
{
return estLigneTotalGeneral;
}
/**
* Modificateur de l attribut est ligne de total général.
*
* @param estLigneTotalGeneral la nouvelle ligne de total général
*/
public void setEstLigneTotalGeneral(Boolean estLigneTotalGeneral)
{
this.estLigneTotalGeneral = estLigneTotalGeneral;
}
/**
* Accesseur de l attribut numero de ligne.
*
* @return le numero de ligne
*/
public Long getNumeroDeLigne()
{
return numeroDeLigne;
}
/**
* Modificateur de l attribut numero de ligne.
*
* @param numeroDeLigne le nouveau numero de ligne
*/
public void setNumeroDeLigne(Long numeroDeLigne)
{
this.numeroDeLigne = numeroDeLigne;
}
/**
* Accesseur de l attribut le exercice.
*
* @return le exercice
*/
public Exercice getLeExercice()
{
return leExercice;
}
/**
* Modificateur de l attribut le exercice.
*
* @param leExercice le nouveau le exercice
*/
public void setLeExercice(Exercice leExercice)
{
this.leExercice = leExercice;
}
/**
* Accesseur de l attribut la categorie entite.
*
* @return la categorie entite
*/
public CategorieEntite getLaCategorieEntite()
{
return laCategorieEntite;
}
/**
* Modificateur de l attribut la categorie entite.
*
* @param laCategorieEntite le nouveau la categorie entite
*/
public void setLaCategorieEntite(CategorieEntite laCategorieEntite)
{
this.laCategorieEntite = laCategorieEntite;
}
/**
* Accesseur de l attribut les entites.
*
* @return les entites
*/
public Set<Entite> getLesEntites()
{
return lesEntites;
}
/**
* Modificateur de l attribut les entites.
*
* @param lesEntites le nouveau les entites
*/
public void setLesEntites(Set<Entite> lesEntites)
{
this.lesEntites = lesEntites;
}
/**
* Accesseur de l attribut les entites audit programme.
*
* @return les entites audit programme
*/
public Set<Entite> getLesEntitesAuditProgramme()
{
return lesEntitesAuditProgramme;
}
/**
* Modificateur de l attribut les entites audit programme.
*
* @param lesEntitesAuditProgramme le nouveau les entites audit programme
*/
public void setLesEntitesAuditProgramme(Set<Entite> lesEntitesAuditProgramme)
{
this.lesEntitesAuditProgramme = lesEntitesAuditProgramme;
}
/**
* Accesseur de l attribut les entites audit engage.
*
* @return les entites audit engage
*/
public Set<Entite> getLesEntitesAuditEngage()
{
return lesEntitesAuditEngage;
}
/**
* Modificateur de l attribut les entites audit engage.
*
* @param lesEntitesAuditEngage le nouveau les entites audit engage
*/
public void setLesEntitesAuditEngage(Set<Entite> lesEntitesAuditEngage)
{
this.lesEntitesAuditEngage = lesEntitesAuditEngage;
}
/**
* Accesseur de l attribut la direction du tcse.
*
* @return la direction du tcse
*/
public Direction getLaDirectionDuTCSE()
{
return laDirectionDuTCSE;
}
/**
* Modificateur de l attribut la direction du tcse.
*
* @param laDirectionDuTCSE le nouveau la direction du tcse
*/
public void setLaDirectionDuTCSE(Direction laDirectionDuTCSE)
{
this.laDirectionDuTCSE = laDirectionDuTCSE;
}
/**
* Accesseur de l attribut programmation.
*
* @return programmation
*/
public BigDecimal getProgrammation()
{
BigDecimal programmationCalculee = BigDecimal.ZERO;
if (nbEntitesA > 0)
{
programmationCalculee =
new BigDecimal(nbEntitesAuditProgrammeB).multiply(new BigDecimal(100)).divide(new BigDecimal(nbEntitesA), 2,
BigDecimal.ROUND_HALF_UP);
}
return programmationCalculee;
}
/**
* Accesseur de l attribut realisation.
*
* @return realisation
*/
public BigDecimal getRealisation()
{
BigDecimal realisationCalculee = BigDecimal.ZERO;
if (nbEntitesA > 0)
{
realisationCalculee =
new BigDecimal(nbEntitesAuditEngageC).multiply(new BigDecimal(100)).divide(new BigDecimal(nbEntitesA), 2,
BigDecimal.ROUND_HALF_UP);
}
return realisationCalculee;
}
/**
* Accesseur de l attribut libelle categorie entite ou libelle cumul.
*
* @return libelle categorie entite ou libelle cumul
*/
public String getLibelleCategorieEntiteOuLibelleCumul()
{
return laCategorieEntite.getLibelle();
}
/**
* Accesseur de l attribut nb entités A pour affichage lien : retourne le nombre d'entités A formaté avec séparateur
* de milliers et sous forme de string pour affichage du lien dans les jsp.
*
* @return nb entités A pour affichage lien dans app:link
*/
public String getNbEntitesAPourAffichageLien()
{
String nbEntitesAPourAffichageLien = null;
DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.FRANCE);
dfs.setGroupingSeparator(' ');
DecimalFormat df = new DecimalFormat("#,###", dfs);
if (nbEntitesA != null)
{
nbEntitesAPourAffichageLien = df.format(nbEntitesA);
}
return nbEntitesAPourAffichageLien;
}
/**
* Accesseur de l attribut nb entités audit programmé B pour affichage lien : retourne le nombre d'entités audit
* programmé B formaté avec séparateur de milliers et sous forme de string pour affichage du lien dans les jsp.
*
* @return nb entités audit programmé B pour affichage lien dans app:link
*/
public String getNbEntitesAuditProgrammeBPourAffichageLien()
{
String nbEntitesAuditProgrammeBPourAffichageLien = null;
DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.FRANCE);
dfs.setGroupingSeparator(' ');
DecimalFormat df = new DecimalFormat("#,###", dfs);
if (nbEntitesAuditProgrammeB != null)
{
nbEntitesAuditProgrammeBPourAffichageLien = df.format(nbEntitesAuditProgrammeB);
}
return nbEntitesAuditProgrammeBPourAffichageLien;
}
/**
* Accesseur de l attribut nb entités audit engagé C pour affichage lien : retourne le nombre d'entités audit engagé
* C A formaté avec séparateur de milliers et sous forme de string pour affichage du lien dans les jsp.
*
* @return nb entités audit engagé C pour affichage lien dans app:link
*/
public String getNbEntitesAuditEngageCPourAffichageLien()
{
String nbEntitesAuditEngageCPourAffichageLien = null;
DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.FRANCE);
dfs.setGroupingSeparator(' ');
DecimalFormat df = new DecimalFormat("#,###", dfs);
if (nbEntitesAuditEngageC != null)
{
nbEntitesAuditEngageCPourAffichageLien = df.format(nbEntitesAuditEngageC);
}
return nbEntitesAuditEngageCPourAffichageLien;
} |
Mon problème est le suivant : je lis par projection mes objets TauxCouvertureSurExerciceDesSIC avec quelques restrictions simples.
Ce que je voudrais faire en plus, c'est obtenir les Set des objets Entite liés à mes TauxCouvertureSurExerciceDesSIC.
Et là, je n'y arrive pas. J'ai essayé des tas de trucs avec les interfaces Projections, rien à faire.
Voici mon code côté accès aux données :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public List<TauxCouvertureSurExercice> findListeTCSESICModeCumulPourUneInterregionAvecEntites(CriteresRechercheIndicateur crit)
{
DetachedCriteria criteria = DetachedCriteria.forClass(TauxCouvertureSurExerciceDesSIC.class);
HibernateTemplate hibernatetemplate = getHibernateTemplate();
ProjectionList uneprojection = Projections.projectionList();
// création d'alias sur les associations
criteria.createAlias("laCategorieEntite", "categ");
// 1- Attention, c'est subtil.... on créée un alias sur laDirectionDuTCSE
criteria.createAlias("laDirectionDuTCSE", "dir");
// 2- On créée ensuite un alias pour l'interrégion à partir de l'alias sur laDirectionDuTCSE
criteria.createAlias("dir.laInterregion", "ir");
criteria.createAlias("lesEntites", "entA", CriteriaSpecification.FULL_JOIN);
criteria.createAlias("lesEntitesAuditProgramme", "entB");
criteria.createAlias("lesEntitesAuditEngage", "entC");
/** DEFINITION DES GROUP BY **/
uneprojection.add(Projections.groupProperty("laCategorieEntite").as("laCategorieEntite"));
// Ajout ordres sum
uneprojection.add(Projections.sum("nbEntitesA"), "nbEntitesA");
uneprojection.add(Projections.sum("nbEntitesAuditProgrammeB"), "nbEntitesAuditProgrammeB");
uneprojection.add(Projections.sum("nbEntitesAuditEngageC"), "nbEntitesAuditEngageC");
// Affectation de la projection à la requête
criteria.setProjection(uneprojection)
.setResultTransformer(new AliasToBeanResultTransformer(TauxCouvertureSurExercice.class));
// restriction(s)
criteria.add(Restrictions.eq("leExercice", crit.getLeExerciceCrit()));
criteria.add(Restrictions.eq("dir.laInterregion", crit.getLaInterRegionCrit()));
List<TauxCouvertureSurExercice> listeTauxCouvertureSurExercice =
(List<TauxCouvertureSurExercice>) hibernatetemplate.findByCriteria(criteria);
// TRI APRES LECTURE avec un BeanComparator.
BeanComparator bcLibelleCategorieEntite = new BeanComparator("laCategorieEntite.libelle", String.CASE_INSENSITIVE_ORDER);
// On effectue d'abord le tri de plus bas niveau (ici catégorie entite.libelle)
Collections.sort(listeTauxCouvertureSurExercice, bcLibelleCategorieEntite);
return listeTauxCouvertureSurExercice;
} |
Si vous avez une idée pour ramener la liste pourvu de ses Set, je suis preneur!
Merci et bonne journée.
Thomas