Usare custom query in Spring Boot e JPA

Mattepuffo's logo
Usare custom query in Spring Boot e JPA

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!


Condividi

Commentami!