【问题标题】:grails - get column in query with joint tablegrails - 使用连接表获取查询中的列
【发布时间】:2017-05-11 02:03:21
【问题描述】:

我有这样的标准设置:

            def e = Equipment.createCriteria()
            def equipmentInstanceList = e.list {
                createAlias "rentals", "r", org.hibernate.sql.JoinType.LEFT_OUTER_JOIN
                projections {
                    property('name')
                    property('r.status')
                    property('r.dateRented')
                    property('r.dateReturned')
                }
            }

我知道它将返回二维列表。正如提到的here。据我了解,第一个列表是所选项目的列表,第二个列表是项目列的列表。我的问题是

如何获得所有选定的项目?示例:

def list = equipmentInstanceList.[all] //supposed to get all the selected items
def a =  equipmentInstanceList[1] //will only get the 1st item in 1st list

如何访问第二个列表中的特定列?示例:

def a = equipmentInstanceList[1].status //supposed to get the status column in 2nd list

编辑:

此查询与上述条件的结果相同。

def equipmentForRent = Equipment.executeQuery("SELECT e.name, r.status, r.dateRented, r.dateReturned FROM ers.Equipment e LEFT JOIN e.rentals r")

我仍在尝试获取 equipmentForRent 中的列。到目前为止我正在尝试什么。

each.equipmentForRent { e -> println e.dateReturned }

仍然出现此错误:

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

为什么和这个查询不同:

def rentalTest = Rental.executeQuery("FROM Rental")
println rentalTest.status //no error, returns the status column from rental

有人吗?

【问题讨论】:

    标签: grails groovy criteria


    【解决方案1】:

    您已将两个问题合二为一: 快速:

    如何获得所有选定的项目?示例:

    如何访问第二个列表中的特定列?示例:

    def a = equipmentInstanceList[1].status //supposed to get the status column in 2nd list
    

    获得第二名:

    def a = equipmentInstanceList[2].status // this now points to 2nd element status
    

    但这些都不是空安全的,并且可能导致问题。 遍历具有索引的元素:

    equipmentInstanceList?.eachWithIndex{  e,i->
      println "-- $i is index $e is element"
     }
    

    您的查询您尝试在 HQL 中进行 sql 查询

    def equipmentForRent = Equipment.executeQuery("SELECT e.name, r.status, r.dateRented, r.dateReturned FROM ers.Equipment e LEFT JOIN e.rentals r")
    

    尝试从表格中选择新地图(项目),如图所示

    def equipmentForRent = Equipment.executeQuery("SELECT new map(e.name as name, r.status as status, r.dateRented as dateRented, r.dateReturned as dateReturned) FROM Equipment e LEFT JOIN e.rentals r")
    

    【讨论】:

    • 您建议的解决方案中的地图键将作为真正的列,对吗?
    • 对不起,我提出了毫无意义的问题。非常感谢您的帮助,查询中的new map 方法解决了我的问题
    • 没问题,我认为您的第二条评论意味着您理解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2022-01-24
    • 2011-01-02
    相关资源
    最近更新 更多