Grails 2.1 createCriteria问题与params

时间:2012-11-29 06:02:14

标签: grails gorm grails-2.0

编辑 -

我正在尝试返回一个投资组合列表,以及我的2个域类中每个投资组合附带的最后5个出版物。我收到最后总共5个出版物,每个列表显示全部5.查询没有返回特定实例拥有的出版物。凯利的伟大创意又回到了另一条轨道。

我在投资组合控制器中创建了该方法,该方法是属于投资组合域类的出版物的hasMany方。

我似乎无法让投资组合列出他们自己的出版物。如果我更改了eq投资组合,那么一切正常,除了每个投资组合列表显示相同的出版物。

如何加载每个投资组合并列出最近的5个出版物。这是作为部分从投资组合/列表页面呈现的。这就是问题所在。我应该从一个与投资组合列表操作无关的新视图中呈现它吗?

新手到grails并阅读和阅读文档,似乎无法让params查询正确返回。帮助

def _webList (){
    //def per = Portfolio.properties
    def portfolios = Portfolio.list(params.id)
    def results = Publication.withCriteria {

        eq('published', 'Yes')
        order('lastUpdated', 'desc')
        maxResults(5)
    }

    def reportscount = Publication.count()

    [ portfolios: portfolios, results: results, reportscount: reportscount]
}

如果需要,我可以显示sql日志。


修改

以下代码是文件_webList.gsp的整个部分。顶部div -alert在页面上加载,但div属性列表组合中的内容无法加载。使用Kelly的hibernate标准会在sql日志中产生查询但不会产生结果或样式,或者任何东西都会返回到视图中。怪异!

<div class="alert alert-info" xmlns="http://www.w3.org/1999/html">Permissions apply to    <strong>editing</strong> publications.<br>
<div style="display: inline;"><p>Click portfolio name to read or edit publications. Total number of sites: <strong>${rsNumb}</strong> | Total number of publications:  <strong>${reportscount}</strong> </p>
</div>
</div>
<div class="property-list portfolio">
<g:each in="${portfolios}" var="portfolioInstance">
<div class="site-listing">
    <div><span class="label">Site Name:</span><g:link action="show" id="${portfolioInstance?.id }">${portfolioInstance?.portfolioName?.encodeAsHTML()}</g:link></div>
    <div><span class="label">Site Description:  </span>${portfolioInstance?.portdescrip?.encodeAsHTML() }</div>   <br>
    <div><span class="label">Site Administrator: </span>${portfolioInstance?.profile?.portfolioAdmin?.encodeAsHTML() }</div>   <br>
    <div><span class="label"> Total publications:</span><span class="badge badge-success"> ${portfolioInstance?.publications?.size()}</span> </div>
 <!-- whatever else you need here -->
 <!-- now iterate through the pubs -->
    <g:if test="${portfolioInstance?.publications}">
        <g:set var="publicationInstance" />
            <ul class="site-publication">
                 <li class="fieldcontain">
                     <span id="publications-label" class="property-label"><g:message code="portfolio.publications.label" default="Last 5 published publications:" /></span>
                         <g:each in="${portfolioInstance.publications}" var="publicationInstance">
                             ${publicationInstance?.id}
                                <span class="property-value" aria-labelledby="publications-label"><g:link controller="publication" action="show" id="${publicationInstance.id}">${publicationInstance?.encodeAsHTML()}</g:link></span>
<!-- and again whatever else you need here -->
                         </g:each>
        </g:if>
</g:each>
</div>

编辑 - 下面的SQL日志

Hibernate: select this_.id as id5_1_, this_.version as version5_1_, this_.date_created as date3_5_1_, this_.last_updated as last4_5_1_, 
this_.portdescrip as portdesc5_5_1_, this_.portfolio_name as portfolio6_5_1_,   this_.portpublished as portpubl7_5_1_, this_.profile_id as profile8_5_1_, 
this_.status as status5_1_, 
publicatio1_.portfolio_id as portfolio5_5_3_, 
publicatio1_.id as id3_, publicatio1_.id as id2_0_, 
publicatio1_.version as version2_0_, 
publicatio1_.date_created as date3_2_0_, 
publicatio1_.last_updated as last4_2_0_, 
publicatio1_.portfolio_id as portfolio5_2_0_, 
publicatio1_.publication_content as publicat6_2_0_, 
publicatio1_.publication_name as publicat7_2_0_, 
publicatio1_.published as published2_0_, 
publicatio1_.publisheddate as publishe9_2_0_, 
publicatio1_.publishedemail as publish10_2_0_, 
publicatio1_.pubproduct_id as pubproduct11_2_0_ 
from portfolio this_ left outer join publication publicatio1_ 
on this_.id=publicatio1_.portfolio_id where (this_.status=?) 
and (publicatio1_.published=?) order by publicatio1_.last_updated desc

1 个答案:

答案 0 :(得分:1)

您收到java.lang.ClassCastException因为portfolios是一个列表,portfolio类(可能)中的Publication不是,它可能是一个id(长);无法以任何有意义的方式投射列表以与eq ('portfolio', portfolios)

中的长整数进行比较

由于域类是相关的,因此您不需要两个单独的查询。

- EDIT-- 编辑不使用单独的操作,只使用列表操作。我也无法使include工作,但下面几乎就是我在几十个案例中所做的事情。如果有某些原因你不能这样做,那么关于仅使用include机制的新问题可能会产生一些关注。

我不确定您当前的列表操作是什么样的。这是我编写列表方法以获取所有投资组合及其最近5个出版物的方式。不需要任何参数,因为我正在返回所有投资组合。

//PortfolioController
def list (){ 
    def portfolios = Portfolio.createCriteria().list {
        //if you needed to filter the list by for example portfolio status or something you could add that here
        or {
            eq('status','ACTIVE')
            eq('status','PENDING')
        }
        publications(org.hibernate.criterion.CriteriaSpecification.LEFT_JOIN) {
            eq("published", "Yes")
            order("lastUpdated", "desc")
            firstResult(5)
        }
    }

    [portfolios: portfolios, portfolioCount:portfolios.size()]
}

现在,出版物已预先附加到其投资组合中。

上述LEFT_JOIN部分确保您获得一份投资组合清单,其中只包含符合标准的附加出版物;如果你把它留下来,它默认为内连接,当你迭代时,你将获得该组合的所有出版物(即使它们不符合标准)。

然后在您的gsp中迭代投资组合 - 它可以直接在list.gsp中,也可以在list.gsp中呈现的模板中。如果您将其放在名为_webList.gsp的模板中,则会在list.gsp中将其呈现为

<g:render template="weblist" model="['portfolios': portfolios]" />

这可以在list.gsp_webList.gsp - 我会直接在list.gsp开始,以确保它全部正常工作。

<g:each in="${portfolios}" var="portfolioInstance" status="i">
    ${portfolioInstance?.portfolioName?.encodeAsHTML()
    <!-- whatever else you need here -->
    <!-- now iterate through the pubs -->
    <g:each in="${portfolioInstance.publications"} var="publicationInstance" status="j">
        ${publicationInstance.id}
        <!-- and again whatever else you need here -->
    </g:each>
</g:each>

- EDIT-- firstResult(5)似乎可以解决问题。 --edit -

你会注意到我在那里发表了maxResults(5)评论 - 我无法让它正常工作。它似乎控制了返回的投资组合的数量,即使它在关联块中。也许其他人会看到这个并添加这个拼图 - 或者自己修补它。如果我搞清楚的话,我会不断尝试和更新。