我的 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
(表的主键)的行列表。prduct_image
product_image
这是我以前的问题。这可以通过以下 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
该问题的答案对应于以下正确的 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
这可以通过以下本机 SQL 来完成,但 HQL 似乎不可能,因为 HQL 只允许在SELECT
和WHERE
子句中进行子查询,FROM
在 HQL 中不允许子句中的子查询。
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;
我的谷歌搜索表明这对于单个 HQL 语句是不可行的。这对 HQL 有可能吗?请确认我。