tutorial query parametros mvc mediante insertar framework example español desarrollo datos data consulta con aplicaciones spring jpa spring-data spring-data-jpa

query - spring framework pdf español



Consulta JPA de datos de primavera con propiedades de parámetros (9)

¿Estás trabajando con @Service también? Porque si lo es, entonces puede @Autowired su PersonRepository al @Service y luego en el servicio solo invoque la clase Name y use el formulario que @CuriosMind ... propuso:

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

y al invocar el método desde el repositorio en el servicio, puede pasar esos parámetros.

¿Cuál es la forma más simple de declarar una consulta JPA de datos de primavera que usa propiedades de un parámetro de entrada como parámetros de consulta?

Por ejemplo, supongamos que tengo una clase de entidad:

public class Person { @Id private long id; @Column private String forename; @Column private String surname; }

y otra clase:

public class Name { private String forename; private String surname; [constructor and getters] }

... entonces me gustaría escribir un repositorio de datos de Spring de la siguiente manera:

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); }

... pero a Spring data / JPA no le gusta que especifique los nombres de las propiedades en el parámetro ?1 .

¿Cuál es la mejor alternativa? }


Defina el método de consulta con firmas de la siguiente manera.

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

Para más detalles, verifique la referencia JPA de Spring Data



Lo que quieres no es posible. Debe crear dos parámetros y vincularlos por separado:

select p from Person p where p.forename = :forename and p.surname = :surname ... query.setParameter("forename", name.getForename()); query.setParameter("surname", name.getSurname());


Puedes probar algo como esto:

public interface PersonRepository extends CrudRepository<Person, Long> { @Query("select p from Person AS p" + " ,Name AS n" + " where p.forename = n.forename " + " and p.surname = n.surname" + " and n = :name") Set<Person>findByName(@Param("name") Name name); }


También puedes resolverlo con un método predeterminado de interfaz:

@Query(select p from Person p where p.forename = :forename and p.surname = :surname) User findByForenameAndSurname(@Param("surname") String lastname, @Param("forename") String firstname); default User findByName(Name name) { return findByForenameAndSurname(name.getLastname(), name.getFirstname()); }

Por supuesto, todavía tendría la función de depósito real públicamente visible ...


si estamos utilizando JpaRepository entonces creará internamente las consultas.

Muestra

findByLastnameAndFirstname (String lastname, String firstname)

findByLastnameOrFirstname (String lastname, String firstname)

findByStartDateBetween (Fecha date1, Date2)

findById (int id)

Nota

si suponemos que necesitamos consultas complejas, entonces necesitamos escribir consultas manuales como

@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);


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);


@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(); }