1

エンティティから選択したフィールドを取得するために、エンドポイント クラスの標準選択クエリを変更しようとしています。ただし、クエリを変更した後でも、クエリ結果がすべてのフィールドをフェッチしていることがわかります。コードは以下のとおりです。クエリが更新され、独自のクエリが追加されていることがわかります。私は基本的に、すべてを取得するのではなく、エンティティからいくつかのプロパティのみを取得するクエリを作成しようとしています(ネットワークデータトランザクション量を減らすため)。どんな助けでも大歓迎です。

//QUERY MODIFIED IN THIS METHOD
/**
 * This method lists all the entities inserted in datastore.
 * It uses HTTP GET method and paging support.
 *
 * @return A CollectionResponse class containing the list of all entities
 * persisted and a cursor to the next page.
 */
@SuppressWarnings({ "unchecked", "unused" })
@ApiMethod(name = "listQuizTable")
public CollectionResponse<QuizTable> listQuizTable(
        @Nullable @Named("cursor") String cursorString,
        @Nullable @Named("limit") Integer limit) {

    EntityManager mgr = null;
    Cursor cursor = null;
    List<QuizTable> execute = null;

    try {
        mgr = getEntityManager();
        //Query query = mgr.createQuery("select from QuizTable as QuizTable");

        Query query = mgr.createQuery("select n.quizKey, n.quizDesc, n.uploadDate from QuizTable n");

        if (cursorString != null && cursorString != "") {
            cursor = Cursor.fromWebSafeString(cursorString);
            query.setHint(JPACursorHelper.CURSOR_HINT, cursor);
        }

        if (limit != null) {
            query.setFirstResult(0);
            query.setMaxResults(limit);
        }

        execute = (List<QuizTable>) query.getResultList();
        cursor = JPACursorHelper.getCursor(execute);
        if (cursor != null)
            cursorString = cursor.toWebSafeString();

        // Tight loop for fetching all entities from datastore and accomodate
        // for lazy fetch.
        for (QuizTable obj : execute)
            ;
    } finally {
        mgr.close();
    }

    return CollectionResponse.<QuizTable> builder().setItems(execute)
            .setNextPageToken(cursorString).build();
}
4

1 に答える 1

1

GAE データストアの射影クエリは目的にかなうはずです。クエリ結果で必要なフィールドのみが返され、不要なフィールドは空白のままになります。クラウド エンドポイントを介してこの変更された応答を受信するには、エンティティのすべてのフィールドではなく必須フィールドのみが含まれるように、個々のエンティティを表す応答アイテムを変更します。次に、この変更された個別の応答アイテムを繰り返して、コレクションの応答アイテムを作成します。

射影クエリには、実行できるクエリの種類にいくつかの制限があります。たとえば、結果に必要なフィールドは等式フィルターでは使用できません。このような制限に達した場合は、射影クエリを使用せずに 2 番目のオプションを直接使用できます。つまり、通常のクエリを実行してから、変更された個別およびコレクションの応答アイテムを使用して、クラウド エンドポイントを介して必要なフィールドのみを送信します。

于 2013-06-16T11:21:53.913 に答える