【问题标题】:Grails how to show HQL JOIN value in g:eachGrails 如何在 g:each 中显示 HQL JOIN 值
【发布时间】:2020-12-26 13:41:12
【问题描述】:

我想问如何在查看页面上显示此代码结果

控制器

query =" select subs.firstName, trx.currentBalance from Transaction trx, Subscriber subs where 
trx.subscriberID = subs.msisdn and trx.subscriberID = '0' and trx.date ='2020-09-04'"
query= Transaction.executeQuery(query);

使用此代码:

查看页面

<g:each in="${listQueryTable}" status="i" var="userInstance">
<tr>
<td>${userInstance.firstName}</td>      <-- this code does not work for me
<td>${userInstance.currentBalance}</td> <-- this code does not work for me
</tr>
</g:each>

【问题讨论】:

  • this code does not work for me 什么意思?
  • @injecteer 我想调用 firstName ,但它向我显示了这样的错误:没有这样的属性:类的名字:java.lang.String。如果我使用 ${userInstance.subs.firstName},则会出现如下错误: subs for class: TransactionController
  • 如果你打印${userInstance}会怎样
  • @injecteer 如果我使用 ${userInstance},结果是:[Ljava.lang.Object;@bf8538 [Ljava.lang.Object;@1c35334
  • 所以,您应该使用索引来打印 GSP 中的值:${userInstance[ 0 ]},它对应于 select 子句中的字段位置

标签: hibernate join grails groovy hql


【解决方案1】:

在控制器中使用 HQL 查询,您可以使用如下索引在 GSP 中显示它的值:

<g:each in="${listQueryTable}" status="i" var="userInstance">
<tr>
<td>${userInstance[0]}</td> 
<td>${userInstance[1]}</td>
</tr>
</g:each>

因为listQueryTable 的每个元素都是Object[]

作为一种变体,您可以像这样将每个列表的元素转换为地图:

query =" select subs.firstName, trx.currentBalance, ..."
listQueryTable = Transaction.executeQuery(query).collect{ [ firstName:it[0], currentBalance:it[1], ... ] }

那么您可以使用原始 GSP 进行展示。

正确的解决方案是摆脱原始 HQL 查询并使用 Hibernate/GORM 方法为 View 构建模型。您必须在域类之间添加引用并使用动态查找器或条件查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多