使用关联进行分页的grails中的Hibernate Query在不同的结果

Aja*_*tha 4 grails groovy hibernate grails-orm

我的三个班级互相联系。

最初,我没有分页地构建查询,并且所有搜索结果都很好。但是现在我需要分页,并且不想打扰我的初始查询模式。有什么办法可以使我得到明显的结果。

Class Department{
    int id;
    String name;
    static hasMany = [courses:Courses]
}

Class Courses{
    String courseName;
    String courseCode;
    static hasMany = [student:Student]
    static belongsTo = [department:Department]
}

Class Student{
    String studentName;
    String address;
    static belongsTo = [courses:Courses]
}


//controller
def list = Department.createCriteria.listDistinct{
    if(params.id){
         and{eq{"id",params.id}}
    }
    and{
        courses{
            if(params.courseName){
                  and{eq("courseName",params.courseName)}
            }
        }
        and{
            student{
                 if(params.studentName){
                         and{eq("studentName",params.studentName)}
                 }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法为您提供实际的表和域,但是关系与上面几乎相同。对于确定的结果,它确实工作得很好,但无法分页。我尝试了多种解决方案,但返回错误。到目前为止,我还没有记录任何错误。我已经知道listDistinct不能用于分页参数。和列表未提供不同的参数。

我尝试投影,但无法像以前一样检索所有属性。有没有解决的办法。因为我需要从这三个表中的所有位置搜索所有可能的属性。我是否需要将所有查询切换到另一种方法?

小智 5

我前段时间很难完成类似的任务-使标准,分页和distinct一起工作,解决方案是:1.使用list()而不是listDistinct()2.使用maxResults和firstResult进行分页3.使用投影{unique'id'}以获取不同的结果4.在获取ID列表之后,使用getAll()方法检索实际对象

所以加入它会是:

def ids = Department.createCriteria().list() {
    projections {
        distinct 'id'
    }
    maxResults params.max
    firstResult params.offset

    if(params.id){
         and{eq{"id",params.id}}
    }
    and{
        courses{
            if(params.courseName){
                  and{eq("courseName",params.courseName)}
            }
        }
        and{
            student{
                 if(params.studentName){
                         and{eq("studentName",params.studentName)}
                 }
            }
        }
    }
}
return Department.getAll(ids)
Run Code Online (Sandbox Code Playgroud)

(代码尚未经过测试)


geo*_*geo 1

根据文档

listDistinct ( ) 方法与分页选项 maxResult 和firstResult配合使用效果不佳。如果您需要分页的不同结果,我们目前建议您使用 HQL。