author-avatar
Dominik Martyniak
JPQL 5 minut

Projekcja JPQL - Tworzenie niestandardowych wyników z zapytań

W świecie programowania i pracy z bazami danych często mamy potrzebę dostosowania wyników zapytań do naszych konkretnych potrzeb. W niektórych przypadkach nie chcemy pobierać pełnych encji, ale wyłącznie wybrane fragmenty danych lub przekształcone informacje. W takich sytuacjach bardzo przydatne okazuje się narzędzie zwanie "projekcją JPQL," które pozwala na dostosowanie wyników zapytań do naszych własnych wymagań.

W poprzednim wpisie omówiliśmy dynamiczne tworzenie zapytań w JPQL. Teraz nadszedł czas, aby dowiedzieć się, jak sprawnie obsługiwać wyniki tych wyszukiwań i wykorzystać projekcję JPQL w pełni.

 

Projekcja JPQL

 

Projekcja JPQL (Java Persistence Query Language) umożliwia tworzenie niestandardowych wyników zapytań, które nie są ściśle powiązane z encjami w bazie danych. Oto kilka sytuacji, w których projekcja JPQL może okazać się użyteczna:

 

  • Wybieranie konkretnych pól: Zamiast pobierać całą encję, można wybrać tylko te pola, które są nam potrzebne. Na przykład, jeśli mamy encję "Klient" z wieloma danymi, a potrzebujemy tylko nazwy i adresu, projekcja JPQL pozwoli nam to zrobić bez konieczności pobierania całego obiektu "Klient".

 

  • Tworzenie niestandardowych obiektów: Możemy tworzyć obiekty, które nie istnieją w bazie danych, ale są zbudowane na podstawie wyników zapytania. Na przykład, jeśli chcemy stworzyć obiekt reprezentujący dane transakcji, który zawiera informacje z kilku encji, projekcja JPQL pozwoli nam to zrobić.

 

  • Przekształcanie wyników: Możemy manipulować wynikami zapytań, np. obliczając średnią wartość lub sumę pewnych pól, a następnie prezentować te dane w wygodny sposób.

 

Kluczową zaletą projekcji JPQL jest to, że możemy dostosować wyniki zapytań do naszych potrzeb, bez konieczności zmieniania struktury bazy danych lub encji. Pozwala to na bardziej efektywne i elastyczne zarządzanie danymi.


Przykład

 

Stwórzmy nasza projekcie, która bedzie wyliczała sumaryczne wartosci przychodów i kosztów tranzakcji użytkownika:

@Getter
public class TransactionSummaryProjection {
    private BigDecimal expenses;
    private BigDecimal revenues;

    public TransactionSummaryProjection(BigDecimal expenses, BigDecimal revenues) {
        this.revenues = Objects.isNull(expenses) ? getZeroScaledBigDecimal() : expenses;
        this.revenues = Objects.isNull(revenues) ? getZeroScaledBigDecimal() : revenues;
    }

    private static BigDecimal getZeroScaledBigDecimal() {
        return BigDecimal.ZERO.setScale(2, RoundingMode.FLOOR);
    }
}

Posiadamy dwa zadeklarowane pola: "expenses" oraz "revenues," a także konstruktor, który inicjuje obiekt z uwzględnieniem wszystkich pól. Dodatkowo, w klasie znajduje się prywatna metoda, która umożliwia zaokrąglenie wartości do dwóch miejsc po przecinku.


Implementacja repozytorium

 

// Metoda, która oblicza sumę wydatków i przychodów na koncie
@Query("SELECT new pl.devset.common.projection.TransactionSummaryProjection( SUM(t.expenses), SUM(t.revenues)) " +
        "FROM Transaction t " +
        "WHERE t.accountId = :accountId")
Optional<TransactionSummaryProjection> getTotal(@Param("accountId") String accountId);

 

W powyższym zapytaniu JPQL:

  • Wykorzystujemy adnotację "@Query" do zdefiniowania zapytania w JPQL.
  • Korzystamy z konstrukcji "SELECT new" do tworzenia obiektu projekcji "TransactionSummaryProjection," przekazując zsumowane wartości "SUM(t.expenses)" (wydatki) oraz "SUM(t.revenues)" (przychody) jako argumenty konstruktora.
  • Zapytanie działa na tabeli "Transaction" (reprezentowanej przez alias "t").
  • Korzystamy z klauzuli "WHERE," aby określić warunek, w którym "t.accountId" musi być równy parametrowi ":accountId."
  • Metoda zwraca wynik w postaci opcjonalnego obiektu "TransactionSummaryProjection," co może być przydatne w przypadku, gdy nie ma danych do zwrócenia.

 

Podsumowanie


W opisie omawiamy wykorzystanie projekcji JPQL (Java Persistence Query Language) w kontekście tworzenia niestandardowych wyników zapytań w bazie danych. Wykorzystanie tej techniki jest przydatne, gdy chcemy dostosować dane do naszych potrzeb, niekoniecznie pobierając całe encje, lecz wybierając konkretne pola lub tworząc niestandardowe obiekty na podstawie wyników zapytania.

Projekcja JPQL daje programistom elastyczność i kontrolę nad wynikami zapytań, co jest niezwykle przydatne w tworzeniu efektywnych aplikacji bazodanowych.

 

3
[jpql, spring boot, sql]

Więcej od Dominik Martyniak

Więcej artykułów