Use new projection capabilities in Spring Data Hopper.
Uses interfaces instead of DTOs to implement projections. Works around DATAJPA-864 [0]. [0] https://jira.spring.io/browse/DATAJPA-864
This commit is contained in:
parent
b205e02e33
commit
e703997be2
|
|
@ -16,48 +16,15 @@
|
||||||
|
|
||||||
package sample.data.jpa.domain;
|
package sample.data.jpa.domain;
|
||||||
|
|
||||||
import java.io.Serializable;
|
public interface HotelSummary {
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.math.MathContext;
|
|
||||||
import java.math.RoundingMode;
|
|
||||||
|
|
||||||
public class HotelSummary implements Serializable {
|
City getCity();
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
String getName();
|
||||||
|
|
||||||
private static final MathContext MATH_CONTEXT = new MathContext(2,
|
Double getAverageRating();
|
||||||
RoundingMode.HALF_UP);
|
|
||||||
|
|
||||||
private final City city;
|
default Integer getAverageRatingRounded() {
|
||||||
|
return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
|
||||||
private final String name;
|
|
||||||
|
|
||||||
private final Double averageRating;
|
|
||||||
|
|
||||||
private final Integer averageRatingRounded;
|
|
||||||
|
|
||||||
public HotelSummary(City city, String name, Double averageRating) {
|
|
||||||
this.city = city;
|
|
||||||
this.name = name;
|
|
||||||
this.averageRating = averageRating == null ? null
|
|
||||||
: new BigDecimal(averageRating, MATH_CONTEXT).doubleValue();
|
|
||||||
this.averageRatingRounded = averageRating == null ? null
|
|
||||||
: (int) Math.round(averageRating);
|
|
||||||
}
|
|
||||||
|
|
||||||
public City getCity() {
|
|
||||||
return this.city;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Double getAverageRating() {
|
|
||||||
return this.averageRating;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getAverageRatingRounded() {
|
|
||||||
return this.averageRatingRounded;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,26 +16,9 @@
|
||||||
|
|
||||||
package sample.data.jpa.domain;
|
package sample.data.jpa.domain;
|
||||||
|
|
||||||
import java.io.Serializable;
|
public interface RatingCount {
|
||||||
|
|
||||||
public class RatingCount implements Serializable {
|
Rating getRating();
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
long getCount();
|
||||||
|
|
||||||
private final Rating rating;
|
|
||||||
|
|
||||||
private final long count;
|
|
||||||
|
|
||||||
public RatingCount(Rating rating, long count) {
|
|
||||||
this.rating = rating;
|
|
||||||
this.count = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Rating getRating() {
|
|
||||||
return this.rating;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getCount() {
|
|
||||||
return this.count;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,13 @@
|
||||||
|
|
||||||
package sample.data.jpa.service;
|
package sample.data.jpa.service;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import sample.data.jpa.domain.City;
|
import sample.data.jpa.domain.City;
|
||||||
import sample.data.jpa.domain.Hotel;
|
import sample.data.jpa.domain.Hotel;
|
||||||
import sample.data.jpa.domain.HotelSummary;
|
import sample.data.jpa.domain.HotelSummary;
|
||||||
import sample.data.jpa.domain.RatingCount;
|
import sample.data.jpa.domain.RatingCount;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
|
@ -32,11 +32,11 @@ interface HotelRepository extends Repository<Hotel, Long> {
|
||||||
|
|
||||||
Hotel findByCityAndName(City city, String name);
|
Hotel findByCityAndName(City city, String name);
|
||||||
|
|
||||||
@Query("select new sample.data.jpa.domain.HotelSummary(h.city, h.name, avg(r.rating)) "
|
@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "
|
||||||
+ "from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
|
+ "from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
|
||||||
Page<HotelSummary> findByCity(City city, Pageable pageable);
|
Page<HotelSummary> findByCity(City city, Pageable pageable);
|
||||||
|
|
||||||
@Query("select new sample.data.jpa.domain.RatingCount(r.rating, count(r)) "
|
@Query("select r.rating as rating, count(r) as count "
|
||||||
+ "from Review r where r.hotel = ?1 group by r.rating order by r.rating DESC")
|
+ "from Review r where r.hotel = ?1 group by r.rating order by r.rating DESC")
|
||||||
List<RatingCount> findRatingCounts(Hotel hotel);
|
List<RatingCount> findRatingCounts(Hotel hotel);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue