2011-12-16 2 views
-2

Как обработать этот SQL-запрос в grails в моем сценарии ProductController? Обратите внимание на две таблицы с присоединением к идентификатору продукта.Два запроса таблицы в скрипте Groovy

SELECT p.*,pd.* 
FROM products p, products_description pd 
WHERE p.products_id=pd.products_id 
ORDER BY p.products_date_added DESC 

Очевидно, что я не могу это сделать:

def all= { 
    def a 
    a = Products.find("FROM products p, products_description pd 
     WHERE p.products_id=pd.products_id ORDER BY p.products_date_added DESC") 
    render a as JSON 
} 
+0

Вы прекратили бы редактировать мой заголовок своим скриптом Groovy, а не GORM finder, поэтому файл, который я редактирую, является ProductsCopntroller.groovy ... – JPM

+0

Это контроллер Grails, где вы пытаетесь написать искатель, взаимодействуя с GORM. Дело в том, что в groovy больше побочный эффект, однако, если вы хотите оставить его с менее точным заголовком, то пусть будет так ... –

+0

Менее опытный, чем вы будете искать скрипт Groovy больше, чем GORM finder .. . Это то, что я бы искал. Это первое, что я услышал о GORM finder ... – JPM

ответ

1

Если вы непреклонны на использование пользовательского запроса SQL вместо каких-либо Грааль динамического искателя, вы можете использовать следующий код:

def session = sessionFactory.getCurrentSession() // a reference to the sessionFactory is injected in all controllers and services that have a sessionFactory variable defined 
    Query query = session.createSQLQuery("SELECT p.*,pd.* 
    FROM products p, products_description pd 
    WHERE p.products_id=pd.products_id 
    ORDER BY p.products_date_added DESC"); 
    def result = query.list() 

Вам нужно будет добавить переменную с именем sessionFactory для вашего контроллера. Что-то вроде этого:

class ProductsController = { 
     def sessionFactory 

В список результатов будет список списков. Каждый элемент основного списка будет представлять собой список размером 2 с первым элементом в качестве продукта, а второй - описанием продукта.

+0

Я следовал вашему примеру и получил эту ошибку: ошибки ERROR .GrailsExceptionResolver - Исключение произошло при обработке запроса: [GET]/mygrails/prods/all org.hibernate.MappingException: Нет Диалектическое сопоставление для типа JDBC: -1 – JPM

+0

Никогда не выяснял, почему, похоже, у него была проблема с столбцом Text, поэтому Я изменил тип с Text на Varchar (10000). Благодаря! – JPM

+0

Если вы хотите сопоставить строку с текстовым полем в базе данных, вам нужно указать это в закрытии отображения. Вам нужно будет добавить <ваше имя поля> типа: «текст» в закрытии отображения в вашем классе домена –

0

Вы можете использовать Many-to-one and one-to-one отношение и пусть GORM заботиться о ассоциации для вас.

class Products { 
    ProductsDescription description 
    ... 
    static mapping = { 
     description column: 'products_id' 
    } 
} 

Вы можете получить доступ описания по ссылке:

a = products.listOrderByProductsDateAdded(order: 'desc') 
a.description.productsDescription 
+0

Жаль, что это не сработает, так как я не могу определить отношения, поскольку таблица уже установлена, и мне нужно выполнить запрос SQL по SQL ... Я подключаюсь к устаревшей БД и так код для каждой из таблиц заблокирован. – JPM

+0

@JPM Вот что я предположил. Вот почему я включил статическое сопоставление для вашего внешнего ключа. – jamesallman

+0

Это не скомпилирует ошибки в классе Products с помощью «Невозможно обработать свойство multi-column как свойство с одним столбцом». – JPM

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