【问题标题】:How to write query of queries in HQL (hibernate)如何在 HQL(休眠)中编写查询查询
【发布时间】:2013-10-29 18:02:17
【问题描述】:

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

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

那我怎么能把它翻译成 HQL 呢?在 HQL 中是否可以查询查询?

示例:

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

表格:

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

SQL 查询:

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

选择评论家Summary.id , COUNT(criticSummary.reviewId) 作为 totalReviews , SUM(criticSummary.isLoved) 作为 totalLoved , SUM(criticSummary.isHated) as 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 

) 作为评论家总结

按评论家Summary.id 分组

【问题讨论】:

    标签: sql hibernate hql


    【解决方案1】:

    你真的需要使用 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 创建一个映射到此视图的实体(与表相同)

    在批评实体中映射它

    @OneToOne
    private CriticSummaryData summaryData;
    

    【讨论】:

    • 非常感谢您的回复。对#2 的快速响应:不幸的是,我的老板不希望我使用视图,我曾建议过它。 #1 的问题:看起来这会生成嵌套的 sql 查询。它是否正确?在写原始查询时,我在SELECT语句中使用了嵌套查询,由于查询中的大量关系,性能很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2012-01-26
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多