Java 对多个列的独特查询不起作用-谷歌应用程序引擎数据存储
我想从endpoint类中的GoogleAppEngine数据存储中获取不同的多个列。对于这一点,我使用下面的代码,但问题是,若我尝试只获取单个列,那个么它只能正常工作并返回不同的数据。若我尝试获取多个列,那个么DISTINCT将不起作用,它将返回所有记录,而不受DISTINCT查询的影响。我不知道我的代码出了什么问题。请提出任何解决方案,并指导我哪里出了问题。 多谢各位 代码:Java 对多个列的独特查询不起作用-谷歌应用程序引擎数据存储,java,android,google-app-engine,google-cloud-datastore,google-cloud-endpoints,Java,Android,Google App Engine,Google Cloud Datastore,Google Cloud Endpoints,我想从endpoint类中的GoogleAppEngine数据存储中获取不同的多个列。对于这一点,我使用下面的代码,但问题是,若我尝试只获取单个列,那个么它只能正常工作并返回不同的数据。若我尝试获取多个列,那个么DISTINCT将不起作用,它将返回所有记录,而不受DISTINCT查询的影响。我不知道我的代码出了什么问题。请提出任何解决方案,并指导我哪里出了问题。 多谢各位 代码: 请注意,DISTINCT仅适用于索引属性。如果uFullName或uName中的任何一个都没有索引,则投影将不起作用
请注意,DISTINCT仅适用于索引属性。如果uFullName或uName中的任何一个都没有索引,则投影将不起作用。我不确定您的代码是否有问题,但DISTINCT关键字仍然是实验性的,如文档中所述,因此这种查询可能存在问题。也许你可以尝试不投射到特定的列上,而是检索所有的列,看看是否有什么不同。我不确定这是否是问题所在,但是使用多个参数的DISTINCT将返回不同的元组。所以在您的查询中,它应该返回每一对不同的uFullName,uUrl。您能提供返回的重复项吗?@PatrickCostello当我使用DISTINCT with single column时,它会返回不同的数据,但如果我使用DISTINCT with multiple column时,它会返回重复项。您能提供一些返回数据的示例吗?@PatrickCostello我正在使用应用程序引擎中的NoSql。总共有12条记录的userName=abc。如果我只使用Distint-uFullName,其中uName='abc',则返回一条带值的记录;如果我使用Distinct-uFullName,其中uUrl,uName='abc',则返回所有12条记录,而不受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;
}