2013-05-12 42 views
0

我與AppEngine上工作,我想查詢的數據實體:的AppEngine JDO查詢不按預期工作

  • 布爾數據「可選」是假。
  • 日期'registrationTimestamp'的升序。

我的代碼:

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

當我看到DATAS,有與 '可選' 的數據是真實的。我想過濾掉'可選'爲真的條目。看來setFilter(「可選==假」)不起作用。

如何執行我想要的查詢?

編輯

我日誌與由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' 
+0

和日誌說怎麼樣查詢? – DataNucleus 2013-05-13 10:14:09

+0

@DataNucleus,當setFilter或setOrdering未被接受時,我找不到索引的異常。但在問題中顯示的查詢中,我沒有得到異常,沒有錯誤日誌。但是我真的在查詢結果中看到「可選==真」數據。所以我認爲setFilter不起作用。 – Tomcat 2013-05-14 03:27:15

+0

日誌告訴你使用了什麼低級別的查詢。 – DataNucleus 2013-05-14 04:29:15

回答

0

雖然直接劈

optional = false 

應該工作,你應該考慮適當添加過濾器爲每documentation

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

希望它有助於

+0

您提供的是低級DataStore API。我想用JDO代替。 – Tomcat 2013-05-13 13:47:17