0

我正在尝试使用端点从 Google App Engine 数据存储区返回一个实体(房间)。此方法(自动生成)返回数据存储区中的所有实体:

    @SuppressWarnings({ "unchecked", "unused" })
public CollectionResponse<Room> listRoom(
        @Nullable @Named("cursor") String cursorString,
        @Nullable @Named("limit") Integer limit) {

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

    try {
        mgr = getEntityManager();
        Query query = mgr.createQuery("select from Room as Room");
        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<Room>) 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 (Room obj : execute)
            ;
    } finally {
        mgr.close();
    }

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

我想编辑它,使它只返回一个基于属性的实体,一个字符串。所以我将把字符串作为参数传入,在数据存储中找到它并返回它。该字符串不会是主键。

编辑:

尝试这个但仍然不起作用:

        public Room getRoom(@Named("id") String mac) {
    EntityManager mgr = null;
    Room room = null;
    try {
        mgr = getEntityManager();
        Query query = mgr.createQuery("SELECT * FROM Room WHERE mac_adds IN ('"+mac+"')");
        room = (Room) query.getSingleResult();
    } finally {
        mgr.close();
    }
    return room;
}

任何帮助表示赞赏。

谢谢,

4

2 回答 2

2

您可以尝试更换:

    for (Room obj : execute)
        ;

    for (Room obj : execute) {
        if( obj.your_property.equal(your_string) ) {
            // do something with new found `obj`, maybe return it
        }
    }

您也很可能不需要CollectionResponse在函数末尾返回。

于 2013-03-19T04:01:00.080 回答
0

我有一个类似的问题,我解决它的方式如下

我在端点类中创建了一个新的 API 方法。就我而言,我必须从 userTable 实体类中获取与特定电子邮件地址相对应的行。所以我将 emailAddress 作为字符串参数传递给我在端点类中添加的 API 方法。我下面的示例 emaiAddress 不是我的实体的主键。

@SuppressWarnings({ "unchecked", "unused" })
@ApiMethod(name = "getUserTableByEmail")
public CollectionResponse<UserTable> getUserTableByEmail(
        @Nullable @Named("cursor") String cursorString,
        @Nullable @Named("limit") Integer limit,
        @Named ("emailAddress") String email) {

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

    try {
        mgr = getEntityManager();
        Query query = mgr.createQuery("select n from UserTable n where n.emailAddress = '"+email+"'");
        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<UserTable>) query.getResultList();
        cursor = JPACursorHelper.getCursor(execute);
        if (cursor != null)
            cursorString = cursor.toWebSafeString();

        for (UserTable obj : execute)
            ;
    } finally {
        mgr.close();
    }

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

但是请注意一件事。我仍然使用该方法返回一个 CollectionResponse 对象,如果您确定只有一行与您的选择条件一起返回,您可以很好地只返回一个 userTable(entity) 对象。我是我的 android 代码,我使用 CollectionResponse.isEmpty() 检查是否有任何返回,如果它返回行然后 ii 使用方法 CollectionResponse.getItem() 来检索行。如果您希望查询只返回一个结果,那么您可以在您的 android 代码中执行端点方法时将整数参数“limit”指定为 1,或者只 query.setMaxResults(1); 输入上面的方法。

于 2013-06-16T09:19:25.423 回答