如何在 Spring Data JPA 中查找具有 OneToMany 关系的队列
How to find cortege with OneToMany relation in Spring Data JPA
我使用 Spring Data JPA 并且有两个实体:
@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;
}
和
@Entity
@Data
@Table(name="booked_time")
public class BookedTime {
@Id
@GeneratedValue
Integer id;
Long startPeriod;
Long finishPeriod;
}
和存储库:
public interface VehicleRepository extends JpaRepository<Vehicle, Integer> {
@Query("correct query")
List<Vehicle> findAllByPeriod(@Param("startPeriod") int startPeriod, @Param("endPeriod") int endPeriod);
}
我需要查找未按时间预订的可用车辆。我该怎么做?
我会选择这样的东西:
@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)"
顺便说一句,我想您可能想尝试将 EAGER
的 FetchType 更改为 bookingTime
的 LAZY
,然后在 select 查询中使用 join fetch
。
所以我找到了我的问题的几种解决方案。第一个由 Enigo 提供,第二个:
@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);
我使用 Spring Data JPA 并且有两个实体:
@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;
}
和
@Entity
@Data
@Table(name="booked_time")
public class BookedTime {
@Id
@GeneratedValue
Integer id;
Long startPeriod;
Long finishPeriod;
}
和存储库:
public interface VehicleRepository extends JpaRepository<Vehicle, Integer> {
@Query("correct query")
List<Vehicle> findAllByPeriod(@Param("startPeriod") int startPeriod, @Param("endPeriod") int endPeriod);
}
我需要查找未按时间预订的可用车辆。我该怎么做?
我会选择这样的东西:
@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)"
顺便说一句,我想您可能想尝试将 EAGER
的 FetchType 更改为 bookingTime
的 LAZY
,然后在 select 查询中使用 join fetch
。
所以我找到了我的问题的几种解决方案。第一个由 Enigo 提供,第二个:
@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);