2012-05-11 6 views
0

у меня есть класс домена под названием Event:Grails ExecuteQuery дает мне «такого свойства» исключение

class Event{ 
    String eventID // an ID for the event, (there are multiple events with same eventID) 
    ..... 
} 

В моем классе Организации мероприятий Я хочу, чтобы все события с разными Идентификаторами событий, поэтому у меня есть следующий запрос:

Event.executeQuery("select distinct e.eventID from Event e", [max: max, offset: offset]) 

Согласно the grails docs, он должен работать. Тем не менее, я получаю эту ошибку:

| Error 2012-05-10 18:14:09,643 [http-bio-8080-exec-9] ERROR errors.GrailsExceptionResolver - MissingPropertyException occurred when processing request: [POST] /events/event/list - 
No such property: id for class: java.lang.String. Stacktrace follows: 
Message: No such property: id for class: java.lang.String 

Line | Method 
->> 35 | run     in C__src_Event_events_grails_app_views_event__List_gsp 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  18 | render . . . . . . in org.events.EventController 
|  67 | list . . . . . . . in  '' 
| 1110 | runWorker   in java.util.concurrent.ThreadPoolExecutor 
| 603 | run . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 722 | run     in java.lang.Thread 

Я довольно новичок в grails, и любая помощь будет принята с благодарностью. Btw Я использую Grails 2.0.1.

ответ

2

Проблема заключается в том, что, включив параметры поискового вызова (max и offset), вы запускаете фреймворк, чтобы попытаться создать PagedResultList.

PagedResultList ожидает размещения объектов домена с идентификаторами.

Однако, ваш оператор выбора возвращает строки. Поэтому сообщение о том, что класс String не имеет атрибута id.

Если вы удалите параметры поискового вызова, он должен работать, и вы должны просто получить список строк.

+0

Спасибо за ваш ответ GreyBeardGeek. Но, по словам grails docs [link] (http://grails.org/doc/2.0.x/ref/Domain%20Classes/executeQuery.html) (третий сверху), это должно работать обряд? – vprasad

+0

В вашем запросе нет позиционных параметров. Запрос, который вы указали на этой странице, имеет позиционные параметры. –

+0

try Event.executeQuery («выберите отдельный e.eventID из события e», null, [max: max, offset: offset]) – jenk

0

Я понял ответ и есть два способа сделать это. Ответ GreyBeardedGeek был частично правильным.

Первый метод

def eveIdList = Event.executeQuery("select distinct e.eventID from Event e", [max: max, offset: offset]) 

Второй метод Получить список Идентификаторы событий:

def eveIdList = Event.createCriteria().list{ 
    projections{ 
     distinct("eventID") 
    } 
    firstResult(offset?:0) 
    maxResults(max?:10) 
} 

Я получил список строк с длиной = макс и смещения. Я получал ошибку, потому что я пытался сделать String.id для каждой из строк eventID. Для того, чтобы получить объекты домена с соответствующим EVENTID, я делаю это:

def eveList = [] 
eveIdList.each{ 
    eveList << Event.findByEventID(it as String) 
} 

Вопросы Я

  • Являются ли они эффективными?
  • Является ли один из способов более эффективным, чем другой?
  • Есть ли лучший способ решить эту проблему?
Смежные вопросы