2013-03-03 2 views
1

Возможность использования Pagination - цель, однако я не уверен, как работать с этим. Отношение является однонаправленным hasMany (см. Ниже). Как текущий он отлично работает без pagination (см. Screenshot), но для работы с разбиением на страницы мне нужно изменить контроллер, чтобы использовать createCriteria. Именно здесь я сталкиваюсь с трудностями, поскольку это довольно странно для отношений.Grails unirectional hasMany createCriteria

домена

Class Tag { 

     String Tag 
     User user 

     static hasMany = [events: Event] 
} 

Контроллер

def searchTags() { 
    println("TAG CONTROLLER - Params sent on click of tag are: "+params.selected) 
    def results = Tag.findByTagAndUser(params.selected, lookupPerson()) 

    //resultTotal is for show for the time being 
    [query: params.selected, results: results, resultTotal: 0] 
} 

GSP

<g:each in="${results.events}" status="i" var="t"> 
    .... ommited as unnessary 
</g:each> 

//Not working yet due to confusing createCriteria issue 
<div class="pagination"> 
    <g:paginate total="${resultTotal}" /> 
</div> 

я мог сделать с небольшим руководством, это то, о чем я сейчас думаю, но я немного смущен:

def tagCriteria = Tag.createCriteria() 
    def result = tagCriteria.list (max: 50, offset: 10) { 
     eq("tag", params.selected) 
     and { 
      eq("user", lookupPerson()) 
     } 
     //Not sure what to do at this point compared with the findByTagAndUser(params.selected, lookupPerson()).events events being the hasMany relationship seen in domain 
     events { 

     } 
    } 

ответ

0

Дайте это попробовать.

def searchTags() {   
    def tagCriteria = Tag.createCriteria() 
    def results = tagCriteria.list (max: 50, offset: 10) { 

     eq("tag", params.selected) 
     eq("user", lookupPerson())    

     projections { 
      property("events") 
     } 
    } 

    [query: params.selected, results: results, resultTotal: results.totalCount] 
} 

HQL версия - Проблема в том, что Вы должны сделать тот же запрос дважды, но выбрать count(e)

Tag.executeQuery(""" 
Select e 
from Tag t join t.events as e 
where t.tag = :selected 
and t.user = :user 
""", [selected: params.selected, user: lookupPerson()], [max: 50, offset 10]) 
+0

спасибо Джеймс, но это не работает. Возврат 'results' дает что-то довольно странное в соответствии с IntelliJ. Объект списка, содержащий набор, то есть' List > ' Там будет только ** один тег, который соответствует **, как я это разработал, я не знаю, поможет ли это в каких-либо предложениях? Я прихожу с этим, не похоже, что это возможно, но наверняка у кого-то была эта проблема:/ – RST

+0

p.s. totalCount возвращает одно, что технически правильно, поскольку только один объект тега, но, очевидно, существует много событий, связанных с этим тегом. Надеюсь, вы сможете это решить :) – RST

+0

Для того, чтобы разбивать события на страницы, вам нужно запросить события. Я бы предложил использовать HQL –

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