Получение данных из таблиц SQL и сопоставление их с каким-либо объектом - PullRequest
0 голосов
/ 07 октября 2018

Длинный вопрос: мой вопрос состоит из нескольких файлов и 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.

Любое решение для этого?Что не так в коде?Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...