2016-07-13 14 views
1

I Spring Data JPA verwenden und haben zwei entites:Wie Trauerzug mit OneToMany Beziehung in Spring Data JPA finden

@Entity 
@Data 
@Table(name="vehicle_entity") 
public class Vehicle { 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String type; 
    private String vehicleRegNumber; 
    @OneToMany(targetEntity = com.transport.model.BookedTime.class, fetch=FetchType.EAGER) 
    @JoinColumn(name="bookingTime", referencedColumnName="id") 
    Set<BookingTime> bookingTime; 
} 

und

@Entity 
@Data 
@Table(name="booked_time") 
public class BookedTime { 
    @Id 
    @GeneratedValue 
    Integer id; 
    Long startPeriod; 
    Long finishPeriod; 

} 

Und Repository:

public interface VehicleRepository extends JpaRepository<Vehicle, Integer> { 

    @Query("correct query") 
    List<Vehicle> findAllByPeriod(@Param("startPeriod") int startPeriod, @Param("endPeriod") int endPeriod); 

} 

I Sie müssen ein verfügbares Fahrzeug finden, welches nicht rechtzeitig gebucht wurde. Weiß jemand wie ich das machen kann.

Antwort

1

Ich möchte mich für etwas gehen:

@Query(nativeQuery=true, value = "select * from vehicle_entity v join booked_time b on b.vehicle = v.id where not (b.startPeriod > :startPeriod and b.endPeriod < :endPeriod)" 

BTW denke ich, dass Sie FetchType von EAGER zu LAZY für bookingTime und dann join fetch in SELECT-Abfrage verwenden, um zu ändern könnte wollen versuchen.

0

So habe ich mehrere Lösungen meines Problems gefunden. Der erste wird von Enigo angeboten und der zweite:

@Query(nativeQuery = false, value = "select v from Vehicle v right join fetch v.bookedTime b \n" + 
      "Where b.vehicle = v.id " + 
      "AND (b.startPeriod < :startPeriod OR b.startPeriod > :finishPeriod) " + 
      "AND (b.finishPeriod < :startPeriod OR b.finishPeriod > :finishPeriod)") 
    Set<Vehicle> findAllByPeriod(@Param("startPeriod") Long startPeriod, @Param("finishPeriod") Long finishPeriod); 
Verwandte Themen