Commit e703997b authored by Oliver Gierke's avatar Oliver Gierke Committed by Stephane Nicoll

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
parent b205e02e
......@@ -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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment