2

Service Builder を使用して Liferay ポートレットを作成しましたが、テーブルが 1 つあります。フィールドの 1 つは、「ZValue」と呼ばれる double 値を保持します。-LocalServiceImpl.java ファイルに、フィールド「ZValue」で現在検出されている最大値を返す public メソッドを追加する必要があります。代わりに単一の値を返す、DynamicQuery に似た Liferay クラスがあることを期待していました。すべてのレコードを返して自分で循環させて最大値を取得できることはわかっていますが、最大値を取得するもっと簡単な方法があると確信しています。

stackoverflow の検索で見つけたものは次のとおりです。

DynamicQuery query = DynamicQueryFactoryUtil.forClass(classname);
query.setProjection(ProjectionFactoryUtil.max("ZValue"));

DynamicQuery は単一の値ではなくリストを返すため、実際に値を返す方法がわかりませんでした。

4

2 に答える 2

2

次の例では、JournalArticle テーブルにクエリを実行して、特定の条件に一致するすべての記事を検索し、それぞれの最新バージョン (最大) のみを取得します。

Pankaj が言ったように、2 つの動的クエリを作成する必要があります。最初のものは、最大値を返す必要があることを指定するために使用されます。

DynamicQuery subQuery = DynamicQueryFactoryUtil.forClass(JournalArticle.class, "articleSub", PortalClassLoaderUtil.getClassLoader())
            .add(PropertyFactoryUtil.forName("articleId").eqProperty("articleParent.articleId"))
            .setProjection(ProjectionFactoryUtil.max("id"));

articleSubクエリに割り当てる単なるエイリアスです。ProjectionFactoryUtil.max最大を返します。

2 つ目は実際のクエリです。最初のクエリから返された値を取得します。

DynamicQuery query = DynamicQueryFactoryUtil.forClass(JournalArticle.class, "articleParent", PortalClassLoaderUtil.getClassLoader())
            .add(PropertyFactoryUtil.forName("id").eq(subQuery))
            .add(PropertyFactoryUtil.forName("type").eq("Slider"));

この DynamicQuery を実行するList<JournalArticle>と、生成された SQL 文によって返されたすべての一致を含む が返されます。

List<JournalArticle> myList = JournalArticleLocalServiceUtil.dynamicQuery(query);
于 2014-06-12T20:12:42.017 に答える