【问题标题】:Hibernate query to Sql queryHibernate 查询到 Sql 查询
【发布时间】:2017-12-07 00:06:12
【问题描述】:

我的产品实体如下所示:

@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';

这个查询返回给我一个订单 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);
}

【问题讨论】:

标签: java postgresql hibernate spring-data-jpa jpql


【解决方案1】:

这是一个由许多实体的列组成的投影,因此您必须采用 Result Class 策略。

基本上,您创建一个带有预期结果字段的 POJO 类和一个等效的构造函数:

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';

并在接口方法上更改返回类型:

@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
    @Query("...") 
    List<ResultClass> findAllByProductName(@Param("name") String name);
}

【讨论】:

  • 我不明白。我要求查询以获取产品名称等于所需值的所有订单。
  • 嗯...好吧,在那种情况下,答案太微不足道了。请阅读@JB Nizet指出的文档。但最后,如果你想从多个表中获取列,就像你的问题一样......那么希望我的帖子会派上用场
  • 这个答案是错误的。您仍在使用 SQL 查询,而不是 JPQL。
【解决方案2】:

试试这个:(它返回完整的 OrderEntity 对象)

@Query("select  o from OrderEntity o join o.products prod where prod.name = :name")
List<OrderEntity> findAllByProductName(@Param("name") String name);

如果您需要获取产品的所有数据,请使用:....OrderEntity o join o.products... 在查询中而不是 OrderEntity o join o.products

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 2023-04-10
    • 2015-10-10
    • 2021-08-27
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多