• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
313 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 (280,450 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 392 wizyt
pytanie zadane 5 stycznia 2022 w Java przez marzena12345 Użytkownik (770 p.)
0 głosów
1 odpowiedź 280 wizyt
0 głosów
1 odpowiedź 404 wizyt
pytanie zadane 14 października 2019 w Java przez JuniorPL Użytkownik (770 p.)

93,327 zapytań

142,323 odpowiedzi

322,396 komentarzy

62,657 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...