【问题标题】:Google app engine return entity based on property基于属性的谷歌应用引擎返回实体
【发布时间】:2013-03-19 02:19:42
【问题描述】:

我正在尝试使用端点从 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;
}

任何帮助表示赞赏。

谢谢,

【问题讨论】:

    标签: android google-app-engine google-cloud-datastore google-cloud-endpoints


    【解决方案1】:

    您可以尝试替换:

        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

    【讨论】:

    • 谢谢,但它不起作用。我在上面写了我正在尝试的更新,仍然没有快乐,但我认为我在正确的轨道上..有什么建议吗?
    • 你不能这样做。它仍然会从列表中下载每个项目!啊
    【解决方案2】:

    我遇到了类似的问题,我的解决方法如下

    我在端点类中创建了一个新的 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); 在上面的方法中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多