【问题标题】:AppEngine JDO query is not working as expectedAppEngine JDO 查询未按预期工作
【发布时间】:2013-05-12 14:59:35
【问题描述】:

我正在使用 AppEngine,我想查询数据实体:

  • 布尔数据“可选”为 False。
  • 日期“registrationTimestamp”的升序。

我的代码:

Query query = pm.newQuery(DeviceInfo.class);
query.setFilter("optional == False");
query.setOrdering("registrationTimestamp asc");
List<DeviceInfo> datas = (List<DeviceInfo>)query.execute();

当我看到数据时,有“可选”为 True 的数据。我想过滤掉“可选”为真的条目。似乎 setFilter("optional == False") 不起作用。

如何执行我想要的查询?

编辑

我得到了 DataNucleus 建议的 DEBUG 级别的日志。

org.datanucleus.plugin.NonManagedPluginRegistry resolveConstraints: Bundle "org.datanucleus.jpa" has an optional dependency to "org.datanucleus.enhancer" but it cannot be resolved
org.datanucleus.plugin.NonManagedPluginRegistry resolveConstraints: Bundle "org.datanucleus" has an optional dependency to "org.eclipse.equinox.registry" but it cannot be resolved
org.datanucleus.plugin.NonManagedPluginRegistry resolveConstraints: Bundle "org.datanucleus" has an optional dependency to "org.eclipse.core.runtime" but it cannot be resolved
org.datanucleus.PersistenceConfiguration setProperty: Property datanucleus.rdbms.sql.allowAllSQLStatements unknown - will be ignored
org.datanucleus.PersistenceConfiguration setProperty: Property datanucleus.rdbms.stringDefaultLength unknown - will be ignored
org.datanucleus.PersistenceConfiguration setProperty: Property datanucleus.appengine.autoCreateDatastoreTxns unknown - will be ignored
org.datanucleus.ObjectManagerFactoryImpl logConfiguration: ================= Persistence Configuration ===============
org.datanucleus.ObjectManagerFactoryImpl logConfiguration: DataNucleus Persistence Factory - Vendor: "DataNucleus"  Version: "1.1.5"
org.datanucleus.ObjectManagerFactoryImpl logConfiguration: DataNucleus Persistence Factory initialised for datastore URL="appengine" driver="" userName=""
org.datanucleus.ObjectManagerFactoryImpl logConfiguration: ===========================================================
org.datanucleus.PersistenceConfiguration setProperty: Property datanucleus.query.cached unknown - will be ignored
org.datanucleus.jdo.metadata.JDOMetaDataManager <init>: Registering listener for metadata initialisation
org.datanucleus.jdo.metadata.JDOAnnotationReader processClassAnnotations: Class "net.xxxxxxxxx.xxxxxxx.server.DeviceInfo" has been specified with JDO annotations so using those.
org.datanucleus.store.appengine.MetaDataValidator validate: Performing appengine-specific metadata validation for net.xxxxxxxxx.xxxxxx.server.DeviceInfo
org.datanucleus.store.appengine.MetaDataValidator validate: Finished performing appengine-specific metadata validation for net.xxxxxxxxx.xxxxxx.server.DeviceInfo
org.datanucleus.store.StoreDataManager registerStoreData: Managing Persistence of Class : net.xxxxxxxxx.xxxxxxx.server.DeviceInfo [Table : <class name="DeviceInfo"
       identity-type="application"
       objectid-class="javax.jdo.identity.ObjectIdentity"
       persistence-modifier="persistence-capable"
>
<inheritance strategy="new-table">
</inheritance>
<field name="deviceRegistrationID"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="gcm"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="key"
       persistence-modifier="persistent"
       primary-key="true"
       null-value="none"
       default-fetch-group="true"
       embedded="false"
       unique="false">
</field>
<field name="optional"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="registrationTimestamp"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
</class>
, InheritanceStrategy : new-table]
org.datanucleus.store.StoreDataManager registerStoreData: Managing Persistence of Class : net.xxxxxxxxx.xxxxxxx.server.DeviceInfo [Table : <class name="DeviceInfo"
       identity-type="application"
       objectid-class="javax.jdo.identity.ObjectIdentity"
       persistence-modifier="persistence-capable"
>
<inheritance strategy="new-table">
</inheritance>
<field name="deviceRegistrationID"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="gcm"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="key"
       persistence-modifier="persistent"
       primary-key="true"
       null-value="none"
       default-fetch-group="true"
       embedded="false"
       unique="false">
</field>
<field name="optional"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
<field name="registrationTimestamp"
       persistence-modifier="persistent"
       null-value="none"
       default-fetch-group="true"
       embedded="true"
       unique="false">
</field>
</class>
, InheritanceStrategy : new-table]
org.datanucleus.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass: Listener found initialisation for persistable class net.xxxxxxxxx.xxxxxxx.server.DeviceInfo
com.google.appengine.api.datastore.QueryResultsSourceImpl logChunkSizeWarning: This query does not have a chunk size set in FetchOptions and has returned over 1000 results.  If result sets of this size are common for this query, consider setting a chunk size to improve performance.
  To disable this warning set the following system property in appengine-web.xml (the value of the property doesn't matter): 'appengine.datastore.disableChunkSizeWarning'

【问题讨论】:

  • 日志说明了查询呢?
  • @DataNucleus,当 setFilter 或 setOrdering 不被接受时,我得到了 index not found 的异常。但是通过问题中显示的查询,我没有收到异常,也没有错误日志。但我确实在查询结果中看到了“可选 == True”数据。所以我认为 setFilter 不起作用。
  • 日志告诉你使用了什么低级查询。
  • @DataNucleus,日志说:com.google.appengine.api.datastore.QueryResultsSourceImpl logChunkSizeWarning:此查询在 FetchOptions 中没有设置块大小,并且返回了 1000 多个结果。如果此大小的结果集对于此查询很常见,请考虑设置块大小以提高性能。要禁用此警告,请在 appengine-web.xml 中设置以下系统属性(属性的值无关紧要):'appengine.datastore.disableChunkSizeWarning' 但没有查询信息。
  • 当我调试时,我会在 DEBUG 级别显示日志

标签: java google-app-engine jdo


【解决方案1】:

虽然直接破解

optional = false 

应该可行,您应该考虑按照documentation 正确添加过滤器

Query q = new Query("DeviceInfo")
            .addFilter("optional",
                       Query.FilterOperator.EQUAL,
                       false);

希望对你有帮助

【讨论】:

  • 您提供的是低级 DataStore API。我想改用 JDO。
猜你喜欢
  • 2012-11-13
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2012-11-18
相关资源
最近更新 更多