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 アラートがページに読み込まれますが、div プロパティ リスト ポートフォリオ内のコンテンツの読み込みに失敗します。ケリーの休止状態基準を使用すると、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
4

1 に答える 1

1

なぜならjava.lang.ClassCastExceptionportfoliosリストでありportfolioPublicationクラスでは(おそらく)そうではありません。おそらくID(長い)です。long in と比較する意味のある方法でリストをキャストすることはできませんeq ('portfolio', portfolios)

ドメイン クラスは関連しているため、2 つの個別のクエリは必要ありません。

--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。というテンプレートに配置すると、 as_webList.gspでレンダリングされますlist.gsp

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

これは inlist.gspまたは-すべてが機能していることを確認するために_webList.gsp、直接 inから始めます。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)ようです。 - 編集 -

そこにコメントがあることに気付くでしょうmaxResults(5)-正しく機能させるのに問題があります。関連ブロックにあるにもかかわらず、返されるポートフォリオの数を制御しているようです。他の誰かがこれを見て、パズルのピースを追加するか、自分でいじるかもしれません。引き続き試してみて、わかったら更新します。

于 2012-11-29T08:35:59.447 に答える