2015-05-28 2 views
0

У меня есть простой SQL-запрос groovy/grails, где я хотел бы получить доступ к MetaData из результата запроса, но я не уверен, как это сделать.groovy hibernate createSQLQuery доступ к ResultSetMetaData?

Пример кода:

String sqlString = “select * from my_table where id = :myID” 
def queryParams = [ myID: 1 ] 
final sqlQuery = session.createSQLQuery(sqlString) 
final queryResults = sqlQuery.with { 
    setProperties(queryParams) 
    list() 
} 

queryResults.collect { r -> 
    r.each{ c -> 
     // I extract result data here 
    } 
} 

Я вижу, что

sqlQuery.class == org.hibernate.impl.SQLQueryImpl 
queryResults.class == java.util.ArrayList 

я увидел следующую статью Groovy Goodness: Access ResultSetMetaData с Groovy SQL: (http://mrhaki.blogspot.com/2011/09/groovy-goodness-access.html), но я могу добраться до ResultSetMetaData используя код queryReults выше?

Редактировать 1: Я думаю, что могу использовать AliasToEntityMapResultTransformer (Retrieve a row from DB as a Map in Hibernate), если я смогу понять, как это сделать.

ответ

0

Спасибо albciff, я нашел другое решение: я прочитал пост Retrieve a row from DB as a Map in Hibernate, и обнаружил, что я мог бы использовать AliasToEntityMapResultsTransformer с кодом SQLQuery, как у меня было:

final queryResults = sqlQuery.with { 
    setProperties(queryParams) 
    setResultsTransformer(AliasToEntityMapResultsTransformer.INSTANCE) 
    list() 
} 

тогда было бы вернуть HashMap, содержащий имя столбца в результатах:

queryResults.collect { r -> 
    r.each{ k, v -> 
     // k = key from MetaData = table column, v = value 
    } 
} 

I D id, что порядок столбцов в resutls больше не соответствует порядку полей в SQL-запросе, но поскольку он возвратил имена столбцов, теперь это не имеет значения.

1

link Вы ссылаетесь на вопрос, получает метаданные, используя непосредственно классы JDBC.

С помощью спящего режима, как вы его используете, я думаю, вы не можете получить метаданные. list() метод на org.hibernate.impl.SQLQueryImpl возвращает список ваших значений результата, если каждая строка имеет более одного результата, тогда он возвращает список object[], однако в этом object[] у вас есть только значения столбцов таблицы, но не метаданные, например, имя столбца.

Для этого спящий режим; если у вас есть ваши лица, определенные в классах вы можете использовать последующий подход, чтобы получить метаданные:

def metadataForMyEntity = sessionFactory.getClassMetadata(YourEntities.class) 
def columnNames = metadataForMyEntity .getPropertyNames() 
def columnTypes = metadataForMyEntity.getPropertyTypes(); 

См SessionFactory и ClassMetadata.

Вместо если вы хотите, чтобы избежать создания сущностей, и вы хотите сделать таким же образом, что в JDBC, использование JDBC непосредственно, как в статье вы ссылаетесь:

import groovy.sql.* 
def db = Sql.newInstance('yourConnectionString', 'user', 'password', 'driver') 
String sqlString = 'select * from my_table where id = 1' 
def rows = db.rows(sqlString , { meta -> 
    .... 
} 

Кстати заметим, что в вашем примере есть опечатка, вы определяете queryResults, но затем вы пытаетесь использовать queryReults для итерации результатов :).

Надеется, что это помогает,

Смежные вопросы