Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate查询到Sql查询_Java_Postgresql_Hibernate_Spring Data Jpa_Jpql - Fatal编程技术网

Java Hibernate查询到Sql查询

Java Hibernate查询到Sql查询,java,postgresql,hibernate,spring-data-jpa,jpql,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(

我的产品实体如下所示:

@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<>();
}
这个查询返回订单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);
}
@存储库
公共接口OrderRepository扩展了JpaRepository{

@Query(“”这是一个由许多entties中的列组成的投影,因此您必须使用Result类策略

基本上,您可以创建一个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);
}
@存储库
公共接口OrderRepository扩展了JpaRepository{
@查询(“…”)
列出findAllByProductName(@Param(“name”)字符串名称);
}
试试这个:(它返回完整的OrderEntity对象)

@Query(“从OrderEntity中选择o加入o.products产品,其中prod.name=:name”)
列出findAllByProductName(@Param(“name”)字符串名称);

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

您阅读过文档吗?该语言名为HQL(或JPQL)。不是Hibernate SQL。阅读并尝试一些东西。如果您花时间阅读文档和示例并尝试一些东西,那么您的查询很容易编写。我不明白。我要求查询“获取所有订单”,其中产品名称等于所需值。嗯…好吧,在这种情况下,这是一个非常简单的答案。请通读do正如@JB Nizet所指出的文档。但是最后如果你想像你的问题那样从多个表中获取列,那么希望我的帖子能够处理好。不管怎样,这个答案是错误的。你仍然在使用SQL查询,而不是JPQL查询。
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);
}
@Query("select  o from OrderEntity o join o.products prod where prod.name = :name")
List<OrderEntity> findAllByProductName(@Param("name") String name);