【问题标题】:Add custom clause to HQL join query将自定义子句添加到 HQL 连接查询
【发布时间】:2022-01-14 15:12:26
【问题描述】:

我有实体 AppVisitManytoOneUser 实体的关系。 User 实体与 UserDetail 实体有 OneToOne 关系。 我需要让所有用户在特定日期的访问次数少于他们的maxDailyVisits

以下是类

public class AppVisit{
   @ManyToOne(fetch = FetchType.LAZY)
   private User user;

   private LocalDate visitDate;
}

public class UserDetail{
     private Long id;        
     private int maxDailyVisits;  

     @OneToOne
     private User user;
}
public class User {    

    private Long id;

    @OneToMany(mappedBy = "user")
    private List<AppVisit> appVisits;

    @OneToOne(mappedBy = "user")
    private UserDetail userDetail;  
}

这里是我尝试在存储库中使用的 HQL 查询

select ud from UserDetail as ud where u.id in 
(select ud1.id from UserDetail as ud1
left join ud1.user.appVisits as av
with acav.visitDate=:visitDate or acav.visitDate is null
Group by u1.id  having Count(ud1.id) < ud1.maxDailyVisits)

在执行时,我对数据库执行了以下 SQL 查询:

select * from "UserDetail" ud
cross join "User" u where ud."User_Id"=u."Id"
and (ud."Id" in
(select ud1."Id" from "UserDetail" ud1
left outer join "User" u1 on ud1."User_Id"=u1."Id"
and (av."VisitDate"=? or av."VisitDate" is null)
left outer join "AppVisit" av
on u1."Id"=av."User_Id"
group by ud1."Id"
having count(ud1."Id")<ud1."MaxDailyVisits"))

我也收到了这个错误:

missing FROM-clause entry for table "av"

因为VisitDate 列上的条件放在AppVisit 表上的联接之前

这个问题有什么解决办法吗?

【问题讨论】:

    标签: postgresql spring-boot hibernate hql


    【解决方案1】:

    当您使用 HQL 时,请提供如下所示的直接实体类名称。

    left join appVisits as av
    

    另一个问题是您也缺少连接条件。完整的查询应该如下所示。

    select ud from UserDetail as ud where u.id in 
    (select ud1.id from UserDetail as ud1
    left join appVisits as av on ud1.id = av.user.id
    where av.visitDate=:visitDate or av.visitDate is null
    Group by u1.id  having Count(ud1.id) < ud1.maxDailyVisits)
    

    【讨论】:

    • 感谢您的贡献,我从您的回答中得到了一些想法来解决我的问题。请注意,您的意思是与实体类“AppVisit”而不是属性“appVisits”进行连接。这就是我的工作方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多