Hibernate 查询到 Sql 查询
Hibernate query to Sql query
我的产品实体如下所示:
@Entity
@Table(name = "order")
public class OrderEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long id;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "order_products",
joinColumns = @JoinColumn(name = "order_id", referencedColumnName = "order_id"),
inverseJoinColumns = @JoinColumn(name = "product_id", referencedColumnName = "id")
)
private Set<ProductEntity> products = new HashSet<>();
}
产品实体:
@Entity
@Table(name = "product")
public class ProductEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(unique = true)
private String name;
@ManyToMany(mappedBy = "products")
private Set<OrderEntity> orders = new HashSet<>();
}
我想获取所有产品名称等于需求值的订单。我编写 sql 查询以从数据库获取结果,但我无法为 Spring Data JPA 编写休眠查询。
我对 postgreSQL 的查询如下所示:
SELECT o.order_id, op.product_id, p.name
FROM public.order o
INNER JOIN public.order_products op
ON p.order_id = op.product_id
INNER JOIN public.product p
ON op.product_id = p.id
WHERE p.name = 'Foo';
这个查询 return 我的订单 ID,product_id 和产品名称。这行得通。但是我不知道如何使用@Query.
将这个问题写成 spring 查询
我的存储库中需要一个方法:
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
@Query("") <- place for my query in Hibernate sql
List<OrderEntity> findAllByProductName(@Param("name") String name);
}
这是一个由许多实体的列组成的投影,因此您必须采用结果 Class 策略。
基本上,您创建一个 POJO class,其中包含预期的结果字段和一个等效的构造函数:
public class ResultClass{
private Integer orderId;
private Integer productId;
private String name;
public ResultClass(Integer orderId, Integer productId, String name){
// set the fields
}
}
然后稍微修改一下查询:
SELECT new com.mypkg.ResultClass(o.order_id, op.product_id, p.name)
FROM public.order o
INNER JOIN public.order_products op
ON p.order_id = op.product_id
INNER JOIN public.product p
ON op.product_id = p.id
WHERE p.name = 'Foo';
并在接口方法上更改return类型:
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
@Query("...")
List<ResultClass> findAllByProductName(@Param("name") String name);
}
试试这个:(它 returns 完整的 OrderEntity 对象)
@Query("select o from OrderEntity o join o.products prod where prod.name = :name")
List<OrderEntity> findAllByProductName(@Param("name") String name);
如果您需要获取产品的所有数据,请使用:...OrderEntity o 在查询中加入 o.products... 而不是 OrderEntity o join o.products
我的产品实体如下所示:
@Entity
@Table(name = "order")
public class OrderEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long id;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "order_products",
joinColumns = @JoinColumn(name = "order_id", referencedColumnName = "order_id"),
inverseJoinColumns = @JoinColumn(name = "product_id", referencedColumnName = "id")
)
private Set<ProductEntity> products = new HashSet<>();
}
产品实体:
@Entity
@Table(name = "product")
public class ProductEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(unique = true)
private String name;
@ManyToMany(mappedBy = "products")
private Set<OrderEntity> orders = new HashSet<>();
}
我想获取所有产品名称等于需求值的订单。我编写 sql 查询以从数据库获取结果,但我无法为 Spring Data JPA 编写休眠查询。
我对 postgreSQL 的查询如下所示:
SELECT o.order_id, op.product_id, p.name
FROM public.order o
INNER JOIN public.order_products op
ON p.order_id = op.product_id
INNER JOIN public.product p
ON op.product_id = p.id
WHERE p.name = 'Foo';
这个查询 return 我的订单 ID,product_id 和产品名称。这行得通。但是我不知道如何使用@Query.
将这个问题写成 spring 查询我的存储库中需要一个方法:
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
@Query("") <- place for my query in Hibernate sql
List<OrderEntity> findAllByProductName(@Param("name") String name);
}
这是一个由许多实体的列组成的投影,因此您必须采用结果 Class 策略。
基本上,您创建一个 POJO class,其中包含预期的结果字段和一个等效的构造函数:
public class ResultClass{
private Integer orderId;
private Integer productId;
private String name;
public ResultClass(Integer orderId, Integer productId, String name){
// set the fields
}
}
然后稍微修改一下查询:
SELECT new com.mypkg.ResultClass(o.order_id, op.product_id, p.name)
FROM public.order o
INNER JOIN public.order_products op
ON p.order_id = op.product_id
INNER JOIN public.product p
ON op.product_id = p.id
WHERE p.name = 'Foo';
并在接口方法上更改return类型:
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
@Query("...")
List<ResultClass> findAllByProductName(@Param("name") String name);
}
试试这个:(它 returns 完整的 OrderEntity 对象)
@Query("select o from OrderEntity o join o.products prod where prod.name = :name")
List<OrderEntity> findAllByProductName(@Param("name") String name);
如果您需要获取产品的所有数据,请使用:...OrderEntity o 在查询中加入 o.products... 而不是 OrderEntity o join o.products