oracle - 每组最大的行 - 进一步将结果集与左连接与 Hibernate 中的其他相关表相结合 - HQL。是否可以?

标签 oracle hibernate oracle10g hql greatest-n-per-group

我的 Oracle 数据库中有两个表 productproduct_image。它们具有从 productproduct_image 的一对多关系。因此,这种关系可以在 Hibernate 中映射如下。

产品实体:

@Entity
@Table(name = "PRODUCT", catalog = "", schema = "WAGAFASHIONDB")
public class Product  implements java.io.Serializable
{
    @OneToMany(mappedBy = "prodId", fetch = FetchType.LAZY)
    private Set<ProductImage> productImageSet; 
}

@Entity
@Table(name = "PRODUCT_IMAGE", catalog = "", schema = "WAGAFASHIONDB")
public class ProductImage  implements java.io.Serializable
{
    @ManyToOne(fetch = FetchType.LAZY)
    private Product prodId;
}

我需要查询可以从中的每组产品中获取具有最大prod_image_id(product_image表的主键)的行列表Product_image 表。

这是我的previous question 。这可以通过以下 SQL 来完成。

SELECT 
     pi.prod_image_id,
     pi.prod_id, pi.prod_image 
FROM 
     product_image pi 
INNER JOIN (
     SELECT 
          MAX(pi.prod_image_id) AS prod_image_id 
     FROM 
          product_image pi 
     GROUP BY 
          pi.prod_id
     ) prod_image 
ON pi.prod_image_id=prod_image.prod_image_id

answer该问题对应于以下正确的 HQL。

SELECT 
    pi.prodImageId, 
    pi.prodId 
FROM 
    ProductImage pi 
WHERE 
    pi.prodImageId in (
    SELECT
         MAX(pis.prodImageId)
    FROM 
         Product p
    INNER JOIN 
         p.productImageSet pis
    GROUP BY 
         p.prodId
)

这将带来完全符合预期的以下结果。

PROD_IMAGE_ID     PROD_ID      PROD_IMAGE
662               284          3562298873030291049_Winter.jpg
644               283          7551758088174802741_9392401244_SS_2505.jpg
595               124          298082252715152799_SS_5012.jpg
566               62           7826143854352037374_SS_5004-A.jpg

但我实际需要的是,上面的SQL/HQL检索到的结果集需要与product表用LEFT OUTER JOIN组合起来,这样就可以从 product 表中检索每个产品,无论 product_image 表中的图像如何,如下所示。

PROD_IMAGE_ID     PROD_ID      PROD_IMAGE
662               284          3562298873030291049_Winter.jpg
644               283          7551758088174802741_9392401244_SS_2505.jpg
595               124          298082252715152799_SS_5012.jpg
 -                101                -
 -                81                 - 
566               62           7826143854352037374_SS_5004-A.jpg

这可以通过以下 native SQL 来完成,但使用 HQL 似乎不可能实现,HQL 只允许在 SELECTWHERE 子句中使用子查询,子查询在HQL 中不允许使用 FROM 子句。

SELECT 
     t.prod_image_id,
     p.prod_id,
     t.prod_image 
FROM
     product p 
LEFT OUTER JOIN(
     SELECT 
           pi.prod_image_id,
           pi.prod_id,
           pi.prod_image 
     FROM
           product_image pi 
     INNER JOIN (
           SELECT 
                MAX(pi.prod_image_id) AS prod_image_id 
           FROM 
                product_image pi
           GROUP BY 
                pi.prod_id
     ) prod_image 
     ON pi.prod_image_id=prod_image.prod_image_id
)t ON p.prod_id=t.prod_id ORDER BY p.prod_id DESC;

我的 Google 搜索显示,使用单个 HQL 语句这是不可行的。这可以通过 HQL 实现吗?请确认我。

最佳答案

你是对的,你不能在 from 子句中使用子查询。

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#queryhql-subqueries

但是您可以使用单独的查询,例如:

select p 
from Product p 
where p.productImageSet is empty

查找没有产品图片的产品。

关于oracle - 每组最大的行 - 进一步将结果集与左连接与 Hibernate 中的其他相关表相结合 - HQL。是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15862348/

相关文章:

java - JPA/Hibernate flatten mapping(只想得到孙子,跳过 child )

sql - 如何使用触发器刷新物化 View ?

java - Ibatis Ref Curosr 与 Oracle 的问题

java - 加载文件到oracle数据库

mysql - 选择 * 数学运算

java.sql.SQLRecoverableException : No more data to read from socket

sql - 替换空格、制表符和回车

java - Hibernate Query.list 返回实际的 Object 实例而不是预期的类型

java - Hibernate/Spring - JUnit 因事务而失败(REQUIRES_NEW)

oracle - 如何防止 Oracle SQL Developer 关闭数据库连接?