Commit 07b489ed by Patryk Czarnik

Eksperymenty dot. dostępu do baz danych w Springu

parent 61a42ca0
......@@ -5,7 +5,9 @@ import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -29,7 +31,7 @@ public class ProductController {
@GetMapping(produces="text/html")
public String getProducts(Model model) {
List<Product> products = productRepository.findAll();
List<Product> products = productRepository.findAll(Sort.by("id"));
model.addAttribute("products", products);
return "products";
}
......@@ -72,6 +74,26 @@ public class ProductController {
}
}
@GetMapping("/max")
public String najdrozszyProdukt(Model model) {
Product produkt = productRepository.najdrozszyProdukt();
model.addAttribute("product", produkt);
return "product";
}
// @GetMapping(path="/min", produces="text/plain")
// @ResponseBody
// public String najtanszyProdukt() {
// return productRepository.nazwaNajtanszego();
// }
@GetMapping("/{id}/ile_drozszych")
@ResponseBody
public long najdrozszyProdukt(@PathVariable Integer id) {
long wynik = productRepository.ileDrozszychNiz(id);
return wynik;
}
@GetMapping("/{id}/add-to-basket")
public String addToBasket(@PathVariable("id") Integer productId,
@SessionAttribute Basket basket) {
......@@ -101,7 +123,6 @@ public class ProductController {
}
}
@PostMapping({"/new", "/{id}/edit"})
// Ta metoda zapisuje dane przysłane z formularza obojętnie, czy to było edit, czy new
// Adnotacja @Valid powoduje, że Spring dokona walidacji obiektu PRZED uruchomieniem tej metody.
// Jeśli nie ma dodatkowego parametru BindingResult, a są błędy walidacji, to Spring naszej metody w ogóle nie uruchomi.
......@@ -109,6 +130,11 @@ public class ProductController {
// metoda zawsze jest uruchamiana przez Springa,
// a w tym parametrze zawarte są informacje o przebiegu walidacji, w tym błędy.
// Bez adnotacji @ModelAttribute też działało
// @Transactional oznacza, że cała metoda jest realizowana w jednej transakcji bazodanowej
// To miałoby znaczenie, gdyby występowało więcej operacji zapisu.
// Wtedy sukces tej metody skutkowałby zatwierdzeniem transakcji, a wyjątek powodowałby wyofanie wszystkich save'ów
@Transactional
@PostMapping({"/new", "/{id}/edit"})
public String saveProduct(@ModelAttribute @Valid Product product,
BindingResult bindingResult) {
// W tej wersji dane z wypełnionego formularza odbieramy w postaci jednego obiektu Product.
......
......@@ -4,7 +4,9 @@ import java.math.BigDecimal;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import jakarta.persistence.EntityManager;
import sklep.model.Product;
/* Gdy w projekcie umieścimy interfejs rozszerzający interfejs JpaRepository (albo podobny)
......@@ -37,4 +39,15 @@ public interface ProductRepository extends JpaRepository<Product, Integer> {
List<Product> findByProductNameContainingIgnoreCase(String name);
@Query("SELECT p FROM Product p ORDER BY p.price DESC LIMIT 1")
Product najdrozszyProdukt();
@Query(nativeQuery=true, value="""
SELECT count(*)
FROM products
WHERE price > (SELECT price FROM products
WHERE product_id = :idInnegoProduktu)
""")
long ileDrozszychNiz(int idInnegoProduktu);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment