java - Hibernate查询转Sql查询

标签 java postgresql hibernate spring-data-jpa jpql

我的产品实体如下所示:

@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<>();
}

我想获取产品名称等于想要的值(value)的所有订单。我编写sql查询来从数据库获取结果,但我无法为Spring Data JPA编写hibernate查询。

我对 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、产品 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);
}

最佳答案

试试这个:(它返回完整的 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

关于java - Hibernate查询转Sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44890346/

相关文章:

sql - PostgreSQL AVG函数中的关键字ALL

java - JPQL查询错误- hibernate 多对多关系

java - 为什么这段代码会进入我的方法的错误 block ?

java - 无法在 JRE 9 上运行 java 飞行记录器

Java 缓存 SSL 失败——我能以某种方式刷新这些吗

PostgreSQL(全文搜索)与 ElasticSearch

postgresql - 防止 PostgreSQL 中的递归触发器

java - @OneToOne 作为 ManyToOneType 返回

java - hibernate:与 View 和表的多对多关系

java - JIRA - 获取项目和问题类型的所有字段