我的 Oracle 数据库中有两个表 product
和 product_image
。它们具有从 product
到 product_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 只允许在 SELECT
和 WHERE
子句中使用子查询,子查询在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/