Bonjour,

Je reviens à la charge.

Je ne comprends pas mon pb, il doit être tout bête mais je tourne en rond


J'ai une classe

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
@Entity
@Table(name = "ETIC_THEMES_USER")
@XmlRootElement
@SqlResultSetMapping(
         name = "findByIdThemeCountQuestions",
        entities = {@EntityResult(entityClass = EticThemesUser.class)},
        columns = {@ColumnResult(name = "countQuestions")}
)
public class EticThemesUser implements Serializable {
....
 
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "idTheme")
    private Collection<EticQuestionsUser> eticQuestionsUserCollection;
    @Transient
    private Integer countQuestions;
 
    public EticThemesUser(BigDecimal idTheme) {
        this.idTheme = idTheme;
    }
 
    public Integer getCountQuestions() {
        this.countQuestions = this.getEticQuestionsUserCollection().size();
        return countQuestions;
    }
 
    public void setCountQuestions(Integer countQuestions) {
        this.countQuestions = countQuestions;
    }
jusqu'a la tout va bien, je tente d'utiliser le SqlResultSetMapping

Avec un objet facade

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
/**
     * Rapporter le nombre de questions en fonction des thèmes
     *
     * @return List<Object[]>
     * Object[0] ramène le thème Object[1] ramène le count
     */
    @Override
    public List<Object[]> getThemeByCountQuestions() {
        String req = "SELECT e.idTheme, count(d.idTheme) as countQuestions FROM EticThemesUser e join e.eticQuestionsUserCollection d on e.idTheme=d.idTheme group by e.idTheme";
        Query query = em.createNativeQuery(req, "findByIdThemeCountQuestions");
        em.
        Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
        DatabaseQuery databaseQuery = ((EJBQueryImpl) query).getDatabaseQuery();
        databaseQuery.prepareCall(session, new DatabaseRecord());
        String sqlString = databaseQuery.getSQLString();
        System.out.println("Requête + " + sqlString);
        return query.getResultList();
    }
}
Cependant dans mes logs c'est comme si le JPQL n'était pas transformé en SQL, car j'ai une requête avant qu'on voit concrètement se transformer ??

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
Précis:   SELECT ID_THEME, ACTIF, DEGRE, LIBELLE_THEME, ORDRE, TOOLTIP FROM ETIC_THEMES WHERE (DEGRE = ?)
    bind => [1 parameter bound]
Infos:   taille : 7
Infos:   EJB : 1
Infos:   EJB : 2
Infos:   EJB : 3
Infos:   EJB : 4
Infos:   EJB : 5
Infos:   EJB : 6
Infos:   EJB : 7
Infos:   Requête + SELECT e.idTheme, count(d.idTheme) as countQuestions FROM EticThemesUser e join e.eticQuestionsUserCollection d on e.idTheme=d.idTheme group by e.idTheme
Précis:   SELECT e.idTheme, count(d.idTheme) as countQuestions FROM EticThemesUser e join e.eticQuestionsUserCollection d on e.idTheme=d.idTheme group by e.idTheme
Avertissement:   Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00942: Table ou vue inexistante
Error Code: 942
Call: SELECT e.idTheme, count(d.idTheme) as countQuestions FROM EticThemesUser e join e.eticQuestionsUserCollection d on e.idTheme=d.idTheme group by e.idTheme
j'ai essayé avec encore plus simple sans le compte et c'est comme si le JPQL était envoyé tel quel à la base ??


Olivier