Длинный вопрос: мой вопрос состоит из нескольких файлов и 2 таблиц.Пожалуйста, прочитайте все файлы, чтобы решить эту проблему.У меня есть 2 таблицы: [Person, Ride]
Table Person:
id name email registration_number
1 test1 abc@gmail.com 11111
2 test2 def@gmail.com 22222
И еще много строк ....
Table Ride:
id person_id start_time end_time distance
1 1 2018-08-08T12:12:12 2018-08-08T14:12:12 100
2 2 2018-08-08T13:12:12 2018-08-08T14:12:12 150
И еще много строк ....
Person.java:
@Entity
@Table(name = "person")
public class Person implements Serializable{
private static final long serialVersionUID = 7401548380514451401L;
public Person() {}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@Column(name = "name")
String name;
@NotNull
@Email
@Column(name = "email")
String email;
@Column(name = "registration_number")
String registrationNumber;
//All setters-getters here
}
Ride.java:
@Entity
@Table(name = "ride")
public class Ride implements Serializable{
private static final long serialVersionUID = 9097639215351514001L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@NotNull
@Column(name = "start_time")
String startTime;
@NotNull
@Column(name = "end_time")
String endTime;
@Column(name = "distance")
Long distance;
@ManyToOne
@JoinColumn(name = "person_id", referencedColumnName = "id")
Person driver;
@ManyToOne
@JoinColumn(name = "rider_id", referencedColumnName = "id")
Person rider;
// All Setters-Getters method here
}
RideController.java:
@RestController
public class RideController {
@Autowired
RideService rideService;
/**
This API returns the top 5 drivers with their email,name, total minutes, maximum ride duration in minutes.
* Only rides that starts and ends within the mentioned durations should be counted.
* Any rides where either start or endtime is outside the search, should not be considered.
*
* DONT CHANGE METHOD SIGNATURE AND RETURN TYPES
* @return
*/
@GetMapping(path = "/api/top-rides")
public ResponseEntity<List<TopDriverDTO>> getTopDriver(
@RequestParam(value="max", defaultValue="5") Long count,
@RequestParam(value="startTime", required=true) @DateTimeFormat(pattern="yyyy-MM-dd'T'HH:mm:ss") LocalDateTime startTime,
@RequestParam(value="endTime", required=true) @DateTimeFormat(pattern="yyyy-MM-dd'T'HH:mm:ss") LocalDateTime endTime){
List<TopDriverDTO> topDrivers = new ArrayList<TopDriverDTO>();
/**
* Your Implementation Here. And Fill up topDrivers Arraylist with Top
*
*/
return ResponseEntity.ok(topDrivers);
}
}
TopDriverDTO.java:
public TopDriverDTO(String name,
String email,
Long totalRideDurationInSeconds,
Long maxRideDurationInSeconds,
Double averageDistance) {
this.setName(name);
this.setEmail(email);
this.setAverageDistance(averageDistance);
this.setMaxRideDurationInSecods(maxRideDurationInSeconds);
this.setTotalRideDurationInSeconds(totalRideDurationInSeconds);
}
public TopDriverDTO() {
}
// All setter - getters here
}
RideServiceImpl.java
@Service
public class RideServiceImpl implements RideService{
@Autowired
RideRepository rideRepository;
public List<TopDriverDTO> findByMaxDuration(){
List<TopDriverDTO> list = rideRepository.findByMaxDuration();
System.out.println("list size: " + list.size());
return list;
}
}
RideRepository.java:
@RestResource(exported = false)
public interface RideRepository extends CrudRepository<Ride, Long> {
@Query(value = "select p.*, top5.duration_seconds / 1 as totalRideDurationInSeconds, top5.max_seconds / 1 as maxRideDurationInSeconds, " +
"top5.avg_distance as averageDistance , top5.driver_id as driver_id,top5.rider_id as rider_id, top5.start_time as start_time, top5.end_time as end_time, top5.distance as distance " +
"from (select r.driver_id as driver_id, r.start_time as start_time, r.end_time as end_time, r.distance as distance, r.rider_id as rider_id, "+
"avg(r.distance) as avg_distance, " +
"sum(to_seconds(r.end_time) - to_seconds(r.start_time)) as duration_seconds, "+
"max(to_seconds(r.end_time) - to_seconds(r.start_time)) as max_seconds "+
"from ride r "+
"where r.start_time >= '2018-08-08T12:12:12' and "+
"r.end_time <= '2018-08-08T18:12:12' "+
"group by r.driver_id "+
"order by duration_seconds desc "+
"limit 5 "+
") top5 join "+
"person p "+
"on top5.driver_id = p.id" , nativeQuery = true)
List<Ride> findByMaxDuration();
}
Этот запрос вышеправильно, но результат не может быть сопоставлен с TopDriverDTO.
Любое решение для этого?Что не так в коде?Заранее спасибо.