【问题标题】:Mapping result of a native SQL query to Grails domain class将原生 SQL 查询的结果映射到 Grails 域类
【发布时间】:2011-01-06 12:21:17
【问题描述】:

是否可以将原生 SQL 查询的结果映射到 Grails 域类实例的集合?

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:
    import com.acme.domain.*
    
    def sessionFactory
    sessionFactory = ctx.sessionFactory  // this only necessary if your are working with the Grails console/shell
    def session = sessionFactory.currentSession 
    
    def query = session.createSQLQuery("select f.* from Foo where f.id = :filter)) order by f.name");
    query.addEntity(com.acme.domain.Foo.class); // this defines the result type of the query
    query.setInteger("filter", 88);
    query.list()*.name;
    

    【讨论】:

    • 我在这个答案中缺少的是def sessionFactory 必须出现在控件中(如果您在像我这样的控制器中执行此操作)。该字段被注入,然后你可以做 sessionFactory.currentSession.
    • 2 小时后我得到了很多“ohengine.jdbc.spi.SqlExceptionHelper:SQL 错误:0,SQLState:53300 ohengine.jdbc.spi.SqlExceptionHelper:致命:剩余的连接槽被保留对于非复制超级用户连接”,当我使用这个实现并且我已经将最大连接设置为 -1。是否可以关闭与您的实施的休眠连接?
    【解决方案2】:

    或者在 Grails 应用程序中使用 Groovy SQL

    import  groovy.sql.Sql
    
    class TestQService{
    
        def dataSource  //Auto Injected
    
        def getBanksForId(int bankid){
    
            def sql = Sql.newInstance(dataSource)
    
            def rows = sql.rows(""" Select BnkCode , BnkName from Bank where BnkId = ?""" , [bankid]) 
    
            rows.collect{
                new Bank(it)
            }
    
        }
    
    
        class Bank{
    
            String BnkCode
            String BnkName
    
            }
    
    }
    

    【讨论】:

    • Sql.newInstance(dataSource) 失败,因为没有采用数据源对象的方法。
    【解决方案3】:

    您可以自己映射它而不会太麻烦。或者如果使用HQL,您可以使用select new map(),然后使用query.list().collect { new MyDomainObject(it) }手动绑定参数。

    【讨论】:

    • 是的,但我想这会比 Hibernate 的高度优化的代码慢得多。
    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多