【问题标题】:DISTINCT query on multiple columns doesn't work - Google App engine Datastore对多列的 DISTINCT 查询不起作用 - Google App engine Datastore
【发布时间】:2014-04-22 05:35:14
【问题描述】:

我想从 endpoint 类中的 Google 应用引擎数据存储区获取不同的多列。为此,我正在使用下面的代码,但问题是如果我尝试仅获取单个列,那么只有它才能正常工作并返回 DISTINCT 数据。如果我尝试获取多个列,则 DISTINCT 不起作用,它会返回所有记录,而不受 Distinct 查询的任何影响。我不知道我的代码有什么问题。请提出任何解决方案并指导我哪里出错了。 谢谢。

代码:

@SuppressWarnings({ "unchecked" })
    @ApiMethod(name = "getDistinctFollow", httpMethod = HttpMethod.GET, path = "userendpoint/userName_fk3")
    public ObjectListContainer getDistinctFollower(
            @Named("followName") ArrayList<String> lstFollower,
            @Nullable @Named("cursor") String cursorString,
            @Nullable @Named("limit") Integer limit) {

        EntityManager mgr = null;
        Cursor cursor = null;
        List<Object[]> lstNames;
        List<String> lstString;
        ObjectListContainer object;
        try {
            mgr = getEntityManager();
            Query query = mgr.createQuery("select distinct f.uFullName,f.uUrl from UMaster f where f.uName in (:followName)");
            query.setParameter("followName", lstFollower);
            if (cursorString != null && cursorString != "") {
                cursor = Cursor.fromWebSafeString(cursorString);
                query.setHint(JPACursorHelper.CURSOR_HINT, cursor);
            }
            if (limit != null) {
                query.setFirstResult(0);
                query.setMaxResults(limit);
            }
            lstNames = (List<Object[]>) query.getResultList();
            cursor = JPACursorHelper.getCursor(lstNames);
            if (cursor != null)
                cursorString = cursor.toWebSafeString();

            lstString = new ArrayList<String>();

            for (Object obj[] : lstNames) {
                lstString.add(obj != null ? obj[0].toString() : null);
                lstString.add(obj != null ? obj[1].toString() : null);
            }
            object = new ObjectListContainer();
            object.setObjectsList(lstString);

        } finally {
            mgr.close();
        }
        return object;
    }

【问题讨论】:

  • 我不确定您的代码有什么问题,但 DISTINCT 关键字仍然是实验性的,如文档中所述,因此这种查询可能存在问题。也许您可以尝试不在特定列上进行投影,而是检索所有列以查看是否有任何区别。
  • 我不确定这是否是问题所在,但具有多个参数的 DISTINCT 将返回不同的元组。因此,在您的查询中,它应该返回每对不同的 (uFullName, uUrl)。您能否提供返回的重复项?
  • @PatrickCostello 当我将DISTINCT 与单列一起使用时,它会返回不同的数据,但如果我将它与多列一起使用,则会返回重复数据。
  • 你能提供一些返回数据的例子吗?
  • @PatrickCostello 我在应用引擎中使用 NoSql。 userName = abc 共有 12 条记录。如果我只使用 Distint uFullName where uName = 'abc',那么它会返回带有值的单个记录,如果我使用 Distinct uFullName,uUrl where uName = 'abc',那么它会返回所有 12 条记录,而没有任何不同查询的影响。

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


【解决方案1】:

请注意,DISTINCT 仅适用于索引属性。 uFullNameuName 中的任何一个都没有被索引,那么投影将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多