Hibernate 如何在HQL中连接两个表以获取一个域类的结果

Hibernate 如何在HQL中连接两个表以获取一个域类的结果,hibernate,grails,gorm,Hibernate,Grails,Gorm,我有两个域类 class User { transient springSecurityService String username String password } Class Request { String type } 按照伯特的建议,我加入了两个独立的班级 class UserRequest implements Serializable{ User user Request request static mapping

我有两个域类

class User {
    transient springSecurityService
    String username
    String password
}

Class Request {
    String type
}
按照伯特的建议,我加入了两个独立的班级

class UserRequest implements Serializable{
    User user
    Request request

    static mapping = {
        id composite: ['user', 'request']
        version false
    }

    //equals & hashcode

    static UserRequest create (User user, Request request, boolean flush = true) {
        def d = new UserRequest (user: user, request: request)
                d.save(flush: flush, insert: true)
    }
}
问题:

如何编写一个方法来获取用户的所有请求,并考虑分页的最大值和偏移量,然后返回列表

我试过的

如您所见,我希望返回列表,以便在我的列表页面中执行以下操作:

<g:each in="${requestList}" status="i" var="requestInstance">
            <tr>
                <td>${requestInstance.type}</td>
            </tr>
</g:each>
问题

但是,我无法访问属性类型,因为列表中返回的对象的类型是Object而不是Request


如何修复此问题?

您无需告诉Hibernate如何加入,这在启动时已配置:

static List<Request> getAllRequestForUser(User user, params) {
   UserRequest.executeQuery(
      'select ur.request from UserRequest ur ' +
      'where ur.user=:user and ur.request.type=:type',
      [type: 'BAR', user: user],
      [max: params.max?: 10, params.offset?: 0])

集合包含对象的实例而不是其中的某个子类,这是没有意义的。是什么让你认为是这样的?它让我认为是这样的,因为我必须遍历列表的g:each不允许我访问请求类的属性。此外,println UserRequest.getAllRequestForUseruser,参数[0]。class.getName打印出ObjectOk,Request.findAll“from…”不会消失,而是Request.ExecuteQuery从请求a,UserRequest b中选择a。。。作品我觉得奇怪的是,有几种方法可以做同样的事情,但有些方法不起作用。我理解,谢谢!还有一件事。。为什么UserRequest.executeQuery可以工作,但UserRequest.findAll不能工作?我忘记了它们之间的区别,现在查看org.codehaus.groovy.grails.orm.hibernate.AbstractHibernateGormStaticApi,代码是相同的,但是由于executeQuery总是工作的,并且实际上是原生hibernate HQL执行的薄包装器,所以我只使用它。
static List<Request> getAllRequestForUser(User user, params) {
   UserRequest.executeQuery(
      'select ur.request from UserRequest ur ' +
      'where ur.user=:user and ur.request.type=:type',
      [type: 'BAR', user: user],
      [max: params.max?: 10, params.offset?: 0])