#java #sql #spring #spring-boot #jpa
#Ява #sql #весна #пружинный ботинок #jpa
Вопрос:
Я использую Spring и JPA для выполнения запросов к базе данных, но у меня есть проблема при использовании оператора LIKE вместе с LocalDate, Long и BigDecimal, так как моя цель-узнать, соответствует ли он переданному параметру, а если нет, я хотел бы по умолчанию иметь пустую дату (я пытался использовать LocalDate.parse («»), но, по-видимому, это не так), пустую BigDecimal и пустую Long. Вот хранилище:
@Query(value = "SELECT pe.nombre AS nombre, pe.apellido AS apellido, pe.dni AS dni, pe.pais AS pais, pe.direccion AS direccion, pe.telefono AS telefono, pe.mail AS mail, pg.producto AS producto, pg.fechaPago as fecha, tp.nombre as tipoPago, pg.comprobante AS comprobante, pg.monto AS monto " "FROM Persona pe JOIN FETCH Pago pg ON pe=pg.persona JOIN FETCH TipoPago tp ON tp=pg.tipo " "WHERE pe.nombre LIKE :nombrePersona% " "AND pe.apellido LIKE :apellidoPersona% " "AND pe.dni LIKE :dni% " "AND pe.pais LIKE :pais% " "AND pe.direccion LIKE :direccion% " "AND pe.telefono LIKE :telefono% " "AND pe.mail LIKE :mail% " "AND pg.producto LIKE :producto% " "AND tp.nombre LIKE :tipoPago% " "AND pg.comprobante LIKE :comprobante% " "AND pg.monto LIKE :monto% " "AND (pg.fechaPago LIKE :fechaPago%) " ) Listlt;PersonaPagoDTOgt; filtrarPersonaPago( @Param("nombrePersona") String nombrePersona, @Param("apellidoPersona") String apellidoPersona, @Param("dni") String dni, @Param("pais") String pais, @Param("direccion") String direccion, @Param("telefono") Long telefono, @Param("mail") String mail, @Param("producto") String producto, @Param("fechaPago") LocalDate fechaPago, @Param("tipoPago") String tipoPago, @Param("comprobante") String comprobante, @Param("monto") BigDecimal monto );
Ресурс:
@GetMapping("/personas/filtrar/pago") public Listlt;PersonaPagoDTOgt; filtrarPersonaPago( PersonaPagoParams personaPagoParams ) { return personaRepository.filtrarPersonaPago(personaPagoParams.getNombrePersona(), personaPagoParams.getApellidoPersona(), personaPagoParams.getDni(), personaPagoParams.getPais(), personaPagoParams.getDireccion(), personaPagoParams.getTelefono(), personaPagoParams.getMail(), personaPagoParams.getProducto(), personaPagoParams.getFechaPago(), personaPagoParams.getTipoPago(), personaPagoParams.getComprobante(), personaPagoParams.getMonto()); }
И класс с параметрами
public class PersonaPagoParams { private String nombrePersona = ""; private String apellidoPersona = ""; private String dni = ""; private String pais = ""; private String direccion = ""; private Long telefono = 0L; private String mail = ""; private String producto = ""; private LocalDate fechaPago = LocalDate.parse(""); private String tipoPago = ""; private String comprobante = ""; private BigDecimal monto = BigDecimal.ZERO; // Getters and setters
Комментарии:
1. Вы должны преобразовать эти поля в текст в своем запросе, если хотите провести текстовое сравнение.
LIKE
ничего не значит в числовом контексте.2. Прекрасно, я думаю, что понимаю. Значит, я должен заключить эти значения в одинарные кавычки? Например: КАК «:Фечапаго%»
3. Нет, ты должен сделать что-то вроде
AND cast(pg.monto as text) LIKE :monto%
этого . Иmonto
параметр метода, вероятно, также должен быть строкой.4. Отлично, большое тебе спасибо, Федерико!
5. Как вы думаете
%
, что делает имя параметра после имени параметра? Может быть, вы имели в видуLIKE :monto || '%'
(илиLIKE CONCAT(:monto, '%')
?