Hibernate HQL 嵌套查询
Hibernate HQL nested query
我有三个 类 具有嵌套关系:
public class Route {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(cascade = {CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchType.EAGER)
private List<Place> places;
}
public class Place {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE}, mappedBy = "place")
private List<Image> images;
}
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.DETACH})
private Place place;
}
我需要通过路线 ID 获取可分页的图像列表。
这就是我的查询:
@Repository
public interface ImageRepository extends CrudRepository<Image, Long> {
@Query("select place.images from Place place where place.id in (select placeD.id from Place placeD where placeD in (select route.places from Route route where route.id = :routeId)) ")
Page<List> findAllByRouteId(@Param("routeId") Long routeId, Pageable Page);
}
我尝试了不同的组合,但仍然没有结果。
我是 HQL 的新手,阅读了很多教程,据我了解,它要求我像现在这样编写连接查询。
但是没用。
它抛出的错误:
InvalidDataAccessResourceUsageException: could not prepare statement
我该如何解决?或者至少我应该挖到哪里?
尝试:
@Query("SELECT DISTINCT i
FROM Route AS r
LEFT JOIN r.places AS p
LEFT JOIN p.images AS i
WHERE r.id = :routeId)) ")
您可以在此处找到更多信息:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-subqueries
当我们尝试将 raw sql 应用于休眠时,有一些事情需要注意。
其他替代方法是使用提到的 JOIN 来简化查询。
我有三个 类 具有嵌套关系:
public class Route {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(cascade = {CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchType.EAGER)
private List<Place> places;
}
public class Place {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE}, mappedBy = "place")
private List<Image> images;
}
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.DETACH})
private Place place;
}
我需要通过路线 ID 获取可分页的图像列表。
这就是我的查询:
@Repository
public interface ImageRepository extends CrudRepository<Image, Long> {
@Query("select place.images from Place place where place.id in (select placeD.id from Place placeD where placeD in (select route.places from Route route where route.id = :routeId)) ")
Page<List> findAllByRouteId(@Param("routeId") Long routeId, Pageable Page);
}
我尝试了不同的组合,但仍然没有结果。 我是 HQL 的新手,阅读了很多教程,据我了解,它要求我像现在这样编写连接查询。
但是没用。 它抛出的错误:
InvalidDataAccessResourceUsageException: could not prepare statement
我该如何解决?或者至少我应该挖到哪里?
尝试:
@Query("SELECT DISTINCT i
FROM Route AS r
LEFT JOIN r.places AS p
LEFT JOIN p.images AS i
WHERE r.id = :routeId)) ")
您可以在此处找到更多信息:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-subqueries
当我们尝试将 raw sql 应用于休眠时,有一些事情需要注意。
其他替代方法是使用提到的 JOIN 来简化查询。