Hibernate HQL返回关联联接,如何在条件中执行此操作?

Hibernate HQL返回关联联接,如何在条件中执行此操作?,hibernate,hql,criteria,Hibernate,Hql,Criteria,我正在使用HQL进行动态查询,但由于有许多参数,我相信这些条件会更“可读”。查询如下所示: String queryString = "select u from ReportSalesUnit as r join r.recipients as u where r.id = :reportSalesUnitId"; if ( firstName != null ) { queryString += " and lower(u.firstName) like :firstName"; }

我正在使用HQL进行动态查询,但由于有许多参数,我相信这些条件会更“可读”。查询如下所示:

String queryString = "select u from ReportSalesUnit as r join r.recipients as u where r.id = :reportSalesUnitId";
if ( firstName != null )
{
    queryString += " and lower(u.firstName) like :firstName";
}
if ( lastName != null )
{
    queryString += " and lower(u.lastName) like :lastName";
}
if ( email != null )
{
    queryString += " and lower(u.email) like :email";
}
if ( phoneNr != null )
{
    queryString += " and u.phoneNr like :phoneNr";
}
Query query = session.createQuery( queryString );
if ( firstName != null )
{
    query.setParameter( "firstName", firstName.toLowerCase() + "%" );
}
if ( lastName != null )
{
    query.setParameter( "lastName", lastName.toLowerCase() + "%" );
}
if ( email != null )
{
    query.setParameter( "email", email.toLowerCase() + "%" );
}
if ( phoneNr != null )
{
    query.setParameter( "phoneNr", phoneNr + "%" );
}
query.setParameter( "reportSalesUnitId", reportSalesUnitId );
...
if(firstName != null) {   
   criteria.add(Restrictions.and(
      Restrictions.isNotNull("firstName"), Restrictions.eq("firstName", firstName.toLowerCase());
...
criteria.createAlias("recipients", "recipients", JoinType.LEFT_OUTER_JOIN);

老实说,我不知道如何返回与条件关联的join。我在这里寻找答案,但找不到答案:,有人能帮我吗?稍微解释一下就好了。

标准也可以这样使用:

String queryString = "select u from ReportSalesUnit as r join r.recipients as u where r.id = :reportSalesUnitId";
if ( firstName != null )
{
    queryString += " and lower(u.firstName) like :firstName";
}
if ( lastName != null )
{
    queryString += " and lower(u.lastName) like :lastName";
}
if ( email != null )
{
    queryString += " and lower(u.email) like :email";
}
if ( phoneNr != null )
{
    queryString += " and u.phoneNr like :phoneNr";
}
Query query = session.createQuery( queryString );
if ( firstName != null )
{
    query.setParameter( "firstName", firstName.toLowerCase() + "%" );
}
if ( lastName != null )
{
    query.setParameter( "lastName", lastName.toLowerCase() + "%" );
}
if ( email != null )
{
    query.setParameter( "email", email.toLowerCase() + "%" );
}
if ( phoneNr != null )
{
    query.setParameter( "phoneNr", phoneNr + "%" );
}
query.setParameter( "reportSalesUnitId", reportSalesUnitId );
...
if(firstName != null) {   
   criteria.add(Restrictions.and(
      Restrictions.isNotNull("firstName"), Restrictions.eq("firstName", firstName.toLowerCase());
...
criteria.createAlias("recipients", "recipients", JoinType.LEFT_OUTER_JOIN);
看起来,它不会有更多的可读性与许多条件。但是
标准
可以在以下方面帮助您:

在达到
标准
/
查询
创建之前,应预先检查空值(或其他例外)。最后,您将获得如下代码,我想这对您来说是可以接受的:

... 
criteria.add(Restrictions.eq("firstName", firstName.toLowerCase()));
criteria.add(Restrictions.eq("phoneNr", phoneNr));
...
criteria.list();
并且,您可以通过以下别名创建联接或获取数据:

String queryString = "select u from ReportSalesUnit as r join r.recipients as u where r.id = :reportSalesUnitId";
if ( firstName != null )
{
    queryString += " and lower(u.firstName) like :firstName";
}
if ( lastName != null )
{
    queryString += " and lower(u.lastName) like :lastName";
}
if ( email != null )
{
    queryString += " and lower(u.email) like :email";
}
if ( phoneNr != null )
{
    queryString += " and u.phoneNr like :phoneNr";
}
Query query = session.createQuery( queryString );
if ( firstName != null )
{
    query.setParameter( "firstName", firstName.toLowerCase() + "%" );
}
if ( lastName != null )
{
    query.setParameter( "lastName", lastName.toLowerCase() + "%" );
}
if ( email != null )
{
    query.setParameter( "email", email.toLowerCase() + "%" );
}
if ( phoneNr != null )
{
    query.setParameter( "phoneNr", phoneNr + "%" );
}
query.setParameter( "reportSalesUnitId", reportSalesUnitId );
...
if(firstName != null) {   
   criteria.add(Restrictions.and(
      Restrictions.isNotNull("firstName"), Restrictions.eq("firstName", firstName.toLowerCase());
...
criteria.createAlias("recipients", "recipients", JoinType.LEFT_OUTER_JOIN);


事实上这不是我想要的。我的选择看起来是这样的:
从ReportSalesUnit中选择u作为r join r.recipients作为u
,我想知道如何使用条件返回关联的join(
r.recipients
),而不是从ReportSalesUnit中选择
作为r
来创建HQL,比如说我创建了这样的条件:
criteria.createCriteria>(ReportSalesUnit.class)
,要返回我提到的asso~join,我只需要添加
条件.createAlias(“recipients”,“recipients”);.setFetchMode(“recipients”,FetchMode.join);
和简单的
条件.list()
?或其他方法