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])