编辑 -
我正在尝试返回一个投资组合列表,以及我的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
答案 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)
评论 - 我无法让它正常工作。它似乎控制了返回的投资组合的数量,即使它在关联块中。也许其他人会看到这个并添加这个拼图 - 或者自己修补它。如果我搞清楚的话,我会不断尝试和更新。