Spring Data JPA,hibernate:通过从另一个表中选择来更新所有查询和SET值

时间:2014-04-05 22:31:17

标签: java spring hibernate jpa spring-data-jpa

JPA查询中是否可以使用以下SQL?我试过,但实际的SQL休眠运行似乎没有。

这是我想写为JPA查询的SQL;

UPDATE movie m SET average_rating = COALESCE((SELECT AVG(stars) FROM rating r WHERE r.movie_id = m.id), 0);

这是JPA查询;

@Query("UPDATE Movie m SET m.averageRating = COALESCE((SELECT AVG(r.stars) FROM Rating r WHERE r.movie = m), 0)")

hibernate说的是什么;

Hibernate:
    insert
    into
        HT_Movie
        select
            movie0_.id as id
        from
            Movie movie0_
Hibernate:
    update
        Movie
    set
        average_rating=coalesce((select
            avg(rating1_.stars)
        from
            Rating rating1_
        where
            rating1_.movie_id=id),
        0)
    where
        (
            id
        ) IN (
            select
                id
            from
                HT_Movie
        )

所以hibernate似乎还有一个额外的地方。

1 个答案:

答案 0 :(得分:0)

@Query("UPDATE Movie m SET m.averageRating = COALESCE((SELECT AVG(r.stars) FROM Rating r WHERE r.movie = m), 0)")

这是100%正确。 并且 hibernate 也能正常工作。 Hibernate 以这种方式工作:

  1. 创建临时表HT_Movie并插入电影表的ID。
  2. 中创建 JPA 查询
  3. 比较HT_Movie中的抽象ID,以便在更新处理中强制执行更快的速度
  4. 这不是新的 hibernate 总是编造查询。