100 votes

Requête Spring data JPA avec propriétés des paramètres

Quelle est la manière la plus simple de déclarer une requête Spring data JPA qui utilise les propriétés d'un paramètre d'entrée comme paramètres de la requête ?

Par exemple, supposons que j'ai une classe d'entité :

public class Person {
    @Id
    private long id;

    @Column
    private String forename;

    @Column
    private String surname;
}

et une autre classe :

public class Name {
    private String forename;
    private String surname;

    [constructor and getters]
}

... alors je voudrais écrire un référentiel de données Spring comme suit :

public interface PersonRepository extends CrudRepository<Person, Long> {
    @Query("select p from Person p where p.forename = ?1.forename and p.surname = ?1.surname")
    findByName(Name name);
}

... mais Spring data / JPA n'aime pas que je spécifie des noms de propriétés sur le fichier ?1 paramètre.

Quelle est la meilleure alternative ?

3voto

Mohammad Points 194

Si nous utilisons JpaRepository, il créera les requêtes en interne.

Echantillon

findByLastnameAndFirstname(String lastname,String firstname)

findByLastnameOrFirstname(string lastname,string firstname)

findByStartDateBetween(Date date1,Date2)

findById(int id)

Note

Si nous avons besoin de requêtes complexes, nous devons écrire des requêtes manuelles, par exemple

@Query("SELECT salesOrder FROM SalesOrder salesOrder WHERE salesOrder.clientId=:clientId AND salesOrder.driver_username=:driver_username AND salesOrder.date>=:fdate AND salesOrder.date<=:tdate ")
 @Transactional(readOnly=true)
 List<SalesOrder> findAllSalesByDriver(@Param("clientId")Integer clientId, @Param("driver_username")String driver_username, @Param("fdate") Date fDate, @Param("tdate") Date tdate);

1voto

Leo Points 357

Travaillez-vous avec un @Service aussi ? Parce que si vous l'êtes, alors vous pouvez @Autowired votre PersonRepository au @Service et ensuite, dans le service, il suffit d'invoquer la Name et utiliser le formulaire que @CuriosMind... a proposé :

@Query(select p from Person p where p.forename = :forename and p.surname = :surname)
User findByForenameAndSurname(@Param("surname") String lastname,
                         @Param("forename") String firstname);
}

et lorsque vous invoquez la méthode à partir du référentiel dans le service, vous pouvez alors passer ces paramètres.

1voto

Anvita Shukla Points 101

La simplicité de Spring Data JPA est qu'il essaie d'interpréter à partir du nom de la fonction dans le référentiel sans spécifier d'annotations supplémentaires @Query ou @Param. Si vous fournissez le nom complet, essayez de le décomposer en prénom et nom de famille, puis utilisez quelque chose comme ceci -

HotelEntity findByName(String name);

Mon HotelEntity contient bien le champ nom JPA tente donc d'interpréter par lui-même pour déduire le nom du champ sur lequel j'essaie d'effectuer une requête et créer une requête ultérieure en interne. D'autres preuves tirées de la documentation JPA - enter image description here

Plus de détails - ici

-3voto

KIBOU Hassan Points 160
    for using this, you can create a Repository for example this one:
    Member findByEmail(String email);

    List<Member> findByDate(Date date);
    // custom query example and return a member
   @Query("select m from Member m where m.username = :username and m.password=:password")
        Member findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

-5voto

Ram Pukar Points 386
@Autowired
private EntityManager entityManager;

@RequestMapping("/authors/{fname}/{lname}")
    public List actionAutherMulti(@PathVariable("fname") String fname, @PathVariable("lname") String lname) {
        return entityManager.createQuery("select A from Auther A WHERE A.firstName = ?1 AND A.lastName=?2")
                .setParameter(1, fname)
                .setParameter(2, lname)
                .getResultList();
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X