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;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.MathContext;
|
||||
import java.math.RoundingMode;
|
||||
public interface HotelSummary {
|
||||
|
||||
public class HotelSummary implements Serializable {
|
||||
City getCity();
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
String getName();
|
||||
|
||||
private static final MathContext MATH_CONTEXT = new MathContext(2,
|
||||
RoundingMode.HALF_UP);
|
||||
Double getAverageRating();
|
||||
|
||||
private final City city;
|
||||
|
||||
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;
|
||||
default Integer getAverageRatingRounded() {
|
||||
return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,26 +16,9 @@
|
|||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
long getCount();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,13 +16,13 @@
|
|||
|
||||
package sample.data.jpa.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import sample.data.jpa.domain.City;
|
||||
import sample.data.jpa.domain.Hotel;
|
||||
import sample.data.jpa.domain.HotelSummary;
|
||||
import sample.data.jpa.domain.RatingCount;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
|
|
@ -32,11 +32,11 @@ interface HotelRepository extends Repository<Hotel, Long> {
|
|||
|
||||
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")
|
||||
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")
|
||||
List<RatingCount> findRatingCounts(Hotel hotel);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue