• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zrobić filtracje po atrybutach wyliczalnych

Object Storage Arubacloud
0 głosów
175 wizyt
pytanie zadane 7 lutego 2023 w Java przez NowyKodujacy Nowicjusz (120 p.)

Witam, mam problem z rozwiązaniem problemu z filtracją po wynikach metod. Mam klase Car z której dziedziczyć będą różne klasy typu: Tir itd. Potrzebuje zrobić filtracje coś w stylu jak na otomoto że można podać np wartości długości auta od do, date produkcji od, albo tylko do oraz filtrowanie po wyniku metod averageSpeed oraz averageFuelCOnsumption, ale bez przypisywania ich jako pole. Próbowałem robić to criteria oraz QueryDSL ale nie wyszło. Z góry dziękuje za wszelkie porady. Pozdrawiam

@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "APP_CAR")
@Entity
public abstract class Car {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String type;
    private Double length;
    @CreatedBy
    private String createdBy;
    @CreatedDate
    private LocalDateTime createdAt;

    public abstract Double averageSpeed();
    public abstract Double averageFuelConsumption();
}

 

1 odpowiedź

+1 głos
odpowiedź 7 lutego 2023 przez Wiciorny Ekspert (270,170 p.)

Skorzystaj z Predicate expressions: 
https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
https://docs.spring.io/spring-data/jpa/docs/1.5.x/api/org/springframework/data/jpa/domain/Specifications.html
dostępnych dla choćby pracy ze strumieniami. 
Predykaty pozwolą Ci  dynamicznie utworzyć zapytanie na podstawie wprowadzonych kryteriów. Na przykład, używając biblioteki takiej jak Spring Data JPA, która udostępnia interfejs JpaSpecificationExecutor,  możesz wykorzystać specyfikacje, czyli funkcje,  na podstawie których określisz jakie rekordy powinny być zwrócone przez zapytanie.

public interface CarRepository extends JpaRepository<Car, Integer>, JpaSpecificationExecutor<Car> {}

// osobno utworzyć

public class CarSpecifications {
    public static Specification<Car> averageSpeedBetween(Double minSpeed, Double maxSpeed) {
        return (root, query, cb) -> {
            Expression<Double> averageSpeed = cb.function("averageSpeed", Double.class, root.get("id"));
            return cb.between(averageSpeed, minSpeed, maxSpeed);
        };
    }
}

 

Podobne pytania

+1 głos
2 odpowiedzi 293 wizyt
pytanie zadane 5 stycznia 2022 w Java przez marzena12345 Użytkownik (770 p.)
0 głosów
1 odpowiedź 218 wizyt
0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 14 października 2019 w Java przez JuniorPL Użytkownik (770 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...