Grails - 查询来自多个域的项目列表

时间:2016-04-11 15:30:53

标签: mongodb grails

处理grails 3申请。我的域名结构定义如下:

Job{
Integer id
String title   
Date publishedDate
}

JobType{
Integer id
String name

}

JobJobTypeMap{
  String jobId
  String jobTypeId
}

例如,

**Job**
id title
1  job1
2  job2

**JobType**
id name
 1 govt
 2 private

**JobJobTypeMap**
jobId jobTypeId
1      1
1      2
2      2

我需要获取具有特定jobType的作业列表(偏移和最大属性以及订单发布日期降序)。

请不要让我改变域名结构。

任何建议都将不胜感激

3 个答案:

答案 0 :(得分:1)

您没有正确定义域类。您不必在Job和JobType之间创建关系类,Grails会自动在您的DB上创建它。

Job{
Integer id
String title   
Date publishedDate
JobType jobType
}

JobType{
Integer id
String name

}

List<Job> jobs = Job.findAllByJobType(jobTypeInstance, [sort: '', order:'', max: '', offset: ''])

答案 1 :(得分:1)

您必须使用Grails SQL / HSQL来查询数据库。

在控制器中

def getList() {

    def params = [column:"job.title", order:'DESC', offset:0, limit:5]

    Sql sql = new Sql(dataSource)
    String query = """
        SELECT  job_job_type_map.job_id jobId, job_job_type_map.job_type_id jobTypeId,
                job.title jobTitle, jobType.name jobTypeName
        FROM    job job, job_type jobType, job_job_type_map job_job_type_map
        WHERE   job_job_type_map.job_id = job.id
        AND     job_job_type_map.job_type_id = jobType.id
        ORDER BY ${params.column} ${params.order}
        LIMIT   :limit
        OFFSET  :offset
    """

    List<GroovyRowResult> result  = sql.rows(query, params)
    result.each {
        println "${it.jobId} ${it.jobTypeId} ${it.jobTitle} ${it.jobTypeName}"
    }

    render template: 'list', model: [jobRows:result]
}
GSP中的

<g:each in="${jobRows}" var="job">
    "${job.jobId} ${job.jobTypeId} ${job.jobTitle} ${job.jobTypeName}" <br/>
</g:each>

小心ORDER BY ${params.column} ${params.order} 在某些地方使用named parameter有限制。您可以找到here

享受!

答案 2 :(得分:0)

如果您不想更改域结构而不想编写SQL / HSQL,则可以使用此方法:

def jobTypeId = JobType.findByName(params.jobTypeName).id
def jobIdList = JobJobTypeMap.findAllByJobTypeId(jobTypeId)?.jobId
def jobList = Job.createCriteria().list(max:max, offset:offset) {
  'in'("id", jobIdList)
  order("publishedDate", "desc")
}

jobList将通过publishedDate为您提供具有特定作业类型,最大值,偏移量和顺序的所有作业的列表。