Grails 2.4.4 executeQuery() 从数据库表连接表

Posted

技术标签:

【中文标题】Grails 2.4.4 executeQuery() 从数据库表连接表【英文标题】:Grails 2.4.4 executeQuery() to join tables from a table of a database 【发布时间】:2017-04-05 20:34:43 【问题描述】:

这是我的域的代码。

class Btr 

    Date dateBreak
    int timeBreak
    String typeBreak
    User usuario

    static constraints = 
    

    static mapping = 

      



class User 

    String name
    String user
    String password
    String confirmPassword
    String state
    String extent
    String movileNumber
    String email
    String address
    Rol rol



    static constraints = 

    

    static mapping = 

    

这是我的控制器的代码。

def df = new SimpleDateFormat("yyyy-MM-dd HH:mm")
def startDate = params.startDate
def stopDate = params.stopDate

resultado = Btr .executeQuery("select dateBreak, timeBreak, typeBreak, 
user, usuario.rol from Btr inner join User on user = usuario.rol where 
dateBreak between :startDate" and :stopDate", [startDate: 
df.parse(startDate), stopDate: df.parse(stopDate)])


render (view: "data", model: [result: resultado])

这是我的看法。

  <g:each in="$result" var="results" status="i">
    <tr><td>results.dateBreak</td><td>results.timeBreak</td><td>
    results.typeBreak </td><td>$results.usuario.rol</td></tr>
    </g:each>

然后我在提交表单时收到此错误。 在 GSP 中,当我打印数据时,

Exception evaluating property 'dateBreak' for java.util.Arrays$ArrayList, Reason: groovy.lang.MissingPropertyException: No such property: dateBreak for class: java.sql.Timestamp 

有人可以告诉我如何使用 executeQuery 连接 grails 中的表,而且学习使用 withCriteria 也很高兴

【问题讨论】:

【参考方案1】:
resultado = Btr .executeQuery("select dateBreak, timeBreak, typeBreak, 
user, usuario.rol from Btr inner join User on user = usuario.rol where 
dateBreak between :startDate" and :stopDate", [startDate: 
df.parse(startDate), stopDate: df.parse(stopDate)])

应该是

resultado = Btr .executeQuery("""select new map (btr.dateBreak as dateBreak, btr.timeBreak as timeBreak, btr.typeBreak as typeBreak, 
u as user, user.usuario.rol  as rol) from Btr btr join btr.user u where 
btr.dateBreak between :startDate and :stopDate""", [startDate: 
df.parse(startDate), stopDate: df.parse(stopDate)])

您拥有的是原始 sql,而不是 HQL,后者略有不同,并使用实际的域对象来加入

对 hasMany 使用左连接,对于典型的一对一关系,它可能是空连接

如果一对一关系可以为空,也使用左连接

除此之外,您还可以将实际查询作为原始 sql 查询,像这样

def sql=new Sql(dataSource)
return sql.rows(query,whereParams)

【讨论】:

以上是关于Grails 2.4.4 executeQuery() 从数据库表连接表的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.4.4 与 Java 8 的兼容性

Spring安全导入在grails 2.4.4下不起作用

防止 Grails 2.4.4 接受无效日期

如何在 grails 2.4.4 中使用 mongodb?

Grails 2.4.4 中的 Spring Security 插件问题

Grails 2.4.4 数据源“create-drop”无法删除所有具有 FK 的表