0

我正在尝试通过查询来汇总一些数据。它是一个相当复杂的对复杂关系的 sql 查询,我想将其转换为 HQL。

我将使用数据关系的简化版本来简化讨论。

那么我怎么能把它翻译成 HQL 呢?在 HQL 中甚至可以查询查询吗?

例子:

假设我们有一个影评人在线评论电影,我们想要返回他评论的电影数量、他喜欢的电影数量和他讨厌的电影数量的总数。

表:

  • 评论家
  • 电影
  • 评论(评论家和电影与 LoveFlag 之间的链接表,如果 LoveFlag 是假的,他讨厌这部电影)

SQL查询:

(这是一个虚构的场景,我正在研究的解决方案是用于设施管理。我在堆栈溢出时编写了这个查询,所以它很可能存在缺陷。)

选择criticSummary.id,计数(criticSummary.reviewId)作为totalReviews,SUM(criticSummary.isLoved)作为totalLoved,SUM(criticSummary.isHated)作为totalHated

从 (

SELECT DISTINCT critic.id AS id, 
    review.id AS reviewId, 
    review.isLoved AS isLoved, 
    CASE WHEN review.isLoved = 1 THEN 0 ELSE 1 END AS isHated

FROM [critic] critic

INNER JOIN [review] review
ON (
    review.criticId = critic.id
    AND review.active = 1
)

WHERE critic.active = 1 

) AS 评论家总结

GROUP BY 评论家Summary.id

4

1 回答 1

0

你真的需要使用 HQL 吗?你有一些选择来简化事情:

1 批评实体中的休眠公式字段

@Formula("select count(*) from reviews where id = id and loved = 1")
public int totalMoviesLoved;

@Formula("select count(*) from reviews where id = id and loved = 0")
public int totalMoviesHated;

public int getTotalMoviesReviewed(){
    return get totalMoviesHated + totalMoviesLoved;
}

2 创建数据库视图

创建一个数据库视图,比如critic_summary_data 创建一个映射到该视图的实体(与表相同)

在 Critic Entity 中映射它

@OneToOne
private CriticSummaryData summaryData;
于 2013-10-29T23:09:59.303 回答