Usare custom query in Spring Boot e JPA
Se in Spring Boot usiamo JPA, abbiamo già diversi metodi per interrogare il database.
Ma può capitare di voler creare delle query custom, ed oggi vediamo come fare.
Questo il mio model, che vi posto solo per completezza di informazioni:
package com.mp.springtest.model;
import javax.persistence.*;
@Entity
@Table(name = "utenti")
public class Utente {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String email;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Questo il repository, al quale ho aggiunto due metodi con query custom:
package com.mp.springtest.model;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
import java.util.Optional;
public interface UtentiRepository extends JpaRepository<Utente, Integer> {
@Query(value = "SELECT * FROM utenti ORDER BY email DESC", nativeQuery = true)
List<Utente> orderByEmail();
@Query(value = "SELECT * FROM utenti WHERE email = ?1", nativeQuery = true)
Optional<Utente> getByEmail(String email);
}
La cosa fondamentale è che mettiate anche l'impostazione nativeQuery a true!
Infine nel controller:
package com.mp.springtest.controller;
import com.mp.springtest.model.Utente;
import com.mp.springtest.model.UtentiRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping(path = "/utenti")
public class UtentiController {
@Autowired
private UtentiRepository utentiRepository;
@PostMapping(path = "/add")
public @ResponseBody
String add(@RequestParam String email, @RequestParam String password) {
Utente u = new Utente();
u.setEmail(email);
u.setPassword(password);
utentiRepository.save(u);
return "OK";
}
@GetMapping(path = "/")
public @ResponseBody
List<Utente> getAll() {
return utentiRepository.orderByEmail();
}
@GetMapping(path = "/{email}")
public @ResponseBody
Optional<Utente> getByEmail(@PathVariable String email) {
return utentiRepository.getByEmail(email);
}
}
Per interrogare i due path:
curl localhost:8080/utenti/
curl localhost:8080/utenti/a@a.it
Enjoy!
java spring boot jpa jpql nativequery
Commentami!