Search code examples
javaspringspring-bootspring-data-jpathymeleaf

Query annotation for spring-data-jpa


Hy all, I would like to know what is wrong with my custum query using Spring Data Jpa. if I use

UtilisateurRepositorie.findAll()

, it work fine

My repository :

@Repository
public interface UtilisateurRepositorie extends JpaRepository <Utilisateur, Long> {       
    @Query ("select u.idUtilisateur, u.login, u.mail, u.nom, u.prenom,u.poste.nomposte, u.idChantier.nomChantier from Utilisateur u ")
    List<Utilisateur> selectAllUser();
}

In my controller

 @Autowired
    private UtilisateurRepositorie utilisateurRepositorie;

     @GetMapping("/userlist")
        public String listerUtilisateur(@RequestParam (name = "page", defaultValue = "0") int page , Model model) {

            List<Utilisateur> lstUser= utilisateurRepositorie.selectAllUser();

            model.addAttribute("listeusers", lstUser);

            return "utilisateur";

        }

I use thymeleaf for my view:

<div>
                        <table class="table table-responsive table-bordered">
                            <thead>
                            <tr>
                                <th data-breakpoints="xs">Login</th>
                                <th>Nom</th>
                                <th>Prenom</th>
                                <th data-breakpoints="xs">mail</th>
                                <th data-breakpoints="xs">Poste</th>
                                <th data-breakpoints="xs">Chantier</th>
                            </tr>
                            </thead>
                            <tbody>
                            <tr th:each="listeuser:${listeusers}">
                                <td th:text="${listeuser.getLogin()}"></td>
                                <td th:text="${listeuser.nom}"></td>
                                <td th:text="${listeuser.prenom}"></td>
                                <td th:text="${listeuser.mail}"></td>
                                <td th:text="${listeuser.poste.nomposte}"></td>
                                <td th:text="${listeuser.idChantier.nomChantier}"></td>
                            </tr>
                            </tbody>
                        </table>
                    </div>

after compile, i got the following error:

org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method getLogin() cannot be found on java.lang.Object[] type
    at org.springframework.expression.spel.ast.MethodReference.findAccessorForMethod(MethodReference.java:211) ~[spring-expression-4.3.6.RELEASE.jar:4.3.6.RELEASE]...

Thanks,


Solution

  • That's because you are trying to cast List<Object[]> to List<Utilisateur>.

    When you perform such a query

    @Query ("select u.idUtilisateur, u.login, u.mail, u.nom, u.prenom,u.poste.nomposte, u.idChantier.nomChantier from Utilisateur u ")
    List<Utilisateur> selectAllUser();
    

    it returns List<Object[]>, because you select multiple fields.

    You should rewrite your query as select u from Utilisateur u if you want to return List<Utilisateur>.

    Otherwise, you need to parse Object[] element by element.