Bonjour,

Dans mon projet Spring MVC & Spring Data JPA.

J'ai une vue présentant une liste d'enregistrements sous forme d'un tableau associé à une seule et unique table de la base de données.
Un système de pagination a été mis en place (Pageable / PageRequest) pour des raisons de performance.

Cette table comporte 4 colonnes de type CLOB que je n'affiche pas dans le tableau.

L'affichage d'un des CLOBs se fait en cliquant sur la ligne du tableau, dans la cellule associée. Une requête AJAX est alors déclenchée et me permet d'afficher son contenu dans une fenêtre modale.

Mais au final, je trouve que le chargement de chaque page du tableau prend une certain temps.
Cela doit être du à la requête findByDldUserCreation() qui me ramène toutes les colonnes, et donc les CLOBs (que je n'affiche pas dans le tableau).

J'ai décidé d'utiliser une Projection pour ramener de la base de données tous les champs, sauf les CLOBs.
https://docs.spring.io/spring-data/j...l/#projections

Et cette solution fonctionne puisqu'on a ceci dans les logs :
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
Hibernate: 
    select
        * 
    from
        ( select
            myssimassd0_.dld_id as col_0_0_,
            myssimassd0_.dld_filename_in as col_1_0_,
            myssimassd0_.dld_filename_out as col_2_0_,
            myssimassd0_.dld_date_creation as col_3_0_,
            myssimassd0_.dld_date_modification as col_4_0_,
            myssimassd0_.dld_nb_lines as col_5_0_,
            myssimassd0_.dld_statut as col_6_0_,
            myssimassd0_.dld_user_creation as col_7_0_,
            myssimassd0_.dld_user_modification as col_8_0_ 
        from
            TOMI.myssi_mass_dld myssimassd0_ 
        where
            myssimassd0_.dld_user_creation like ? 
        order by
            myssimassd0_.dld_date_creation DESC ) 
    where
        rownum <= ?
Mais je ne parviens pas à "bien" récupérer ces données !
Quelqu'un a-t-il une idée de comment faire ?
sachant que ces données sont destinées à être afficher via une boucle JSTL dans ma page JSP.
Merci.

Voici ce que j'ai fait:

L'entité:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
@Table(name = "MYSSI_MASS_DLD")
public class MyssiMassDld implements Serializable {
 
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	protected long dldId;
 
	private String dldCsvIn;  // Le Clob !
	private Date dldDateCreation;
	private String dldUserCreation;
 
	...
}
La projection:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
public interface MyssiMassDldProjection {
	long getDldId();
	Date getDldDateCreation();
	String getDldUserCreation();
}
Le repository:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
public interface MyssiMassDldRepository extends JpaRepository<MyssiMassDld, Long> {
	@Query("SELECT d.dldId AS dld_id, d.dldDateCreation AS dld_date_creation, " + 
                    "d.dldUserCreation AS dld_user_creation FROM MyssiMassDld d " + 
                    "WHERE d.dldUserCreation LIKE ?1 ORDER BY d.dldDateCreation DESC")
	public Page<MyssiMassDldProjection> findByDldUserCreation(String dldUserCreation, Pageable pageable);
}
Le test:
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
public class MyssiMassDldIdRepositoryTest {
	@Autowired
	private MyssiMassDldRepository dao;
 
	@Test
	public void test01() {
		Page<MyssiMassDldProjection> page = dao.findByDldUserCreation("USER01%", new PageRequest(0, 5));
		List<MyssiMassDldProjection> list = page.getContent();
		log.info("{}", list.get(0));
	}
 
	@Test
	public void test02() {
		Page<MyssiMassDldProjection> page = dao.findByDldUserCreation("USER01%", new PageRequest(0, 5));
		for (MyssiMassDldProjection x : page.getContent()) {
			log.info("{}", x.getDldId());
		}
	}
Le test01() fonctionne.
Car j'obtiens:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
2017-08-25 11:20:07.478 [main                     ] INFO  --- MyssiMassDldIdRepositoryTest   findByDldUserCreationPageable0 :     72 - [74, 2017-08-23 15:34:35.0, USER01 ]
Mais pas le test02().
Pour lequel j'obtiens cette erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to MyssiMassDldProjection
L'erreur est associée à la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
for (MyssiMassDldProjection x : page.getContent()) {
En fait, Java ne parviens pas à « caster » l'élément de la liste en objet « MyssiMassDldProjection » !?

alors qu'il parviens bien à afficher son contenu dans le test01() !!??

Je ne comprends pas !!!!!!!!!