【发布时间】:2019-05-06 11:04:23
【问题描述】:
我遇到了 Apache Ignite SQL 的问题。目前我正在使用 Ignite v2.6,但也看到与以前版本相同的问题。
有一个缓存是这样定义的:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="Tasks"/>
<property name="cacheMode" value="PARTITIONED" />
<property name="backups" value="1" />
<property name="storeKeepBinary" value="true" />
<property name="atomicityMode" value="TRANSACTIONAL"/>
<property name="writeSynchronizationMode" value="FULL_SYNC"/>
<property name="nodeFilter" ref="TaskNodeFilter" />
<property name="queryEntities">
<list>
<bean class="org.apache.ignite.cache.QueryEntity">
<property name="keyType" value="java.util.UUID"/>
<property name="valueType" value="Tasks" />
<property name="fields">
<map>
<entry key="id" value="java.util.UUID"/>
<entry key="created" value="java.lang.Long"/>
<entry key="jobId" value="java.util.UUID"/>
<entry key="exception" value="java.lang.Object"/>
<entry key="lastAction" value="java.lang.Long"/>
<entry key="jobId" value="java.util.UUID"/>
<entry key="masterId" value="java.util.UUID"/>
<entry key="identifier" value="java.lang.String"/>
<entry key="status" value="java.lang.Integer"/>
<entry key="nodeId" value="java.util.UUID"/>
<entry key="status" value="java.lang.Integer"/>
<entry key="progressMax" value="java.lang.Long"/>
<entry key="progressAt" value="java.lang.Long"/>
<entry key="actionType" value="java.lang.String"/>
</map>
</property>
<property name="indexes">
<list>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="jobId"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="status"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="actionType"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="created"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="masterId"/>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
“created”条目是来自 System.currentTimeMillis() 的时间戳,因此在 Java 中它是一个长值。所以我在缓存配置中将此字段设置为“Java.lang.Long”。
现在,当我使用 SQL 进行搜索时,我会根据我的查询得到不同的结果,但始终具有相同的范围:
select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where created BETWEEN 1543705200000 AND 1545433200000;
返回 0(错误!)
select COUNT(id) as ANZAHL
FROM "Tasks".Tasks
where CAST(created AS BIGINT) BETWEEN 1543705200000 AND 1545433200000;
返回 1142(这是预期值)
select COUNT(*) as ANZAHL
FROM "Tasks".Tasks
where CAST(created AS BIGINT) BETWEEN 1543705200000 AND 1545433200000;
返回 0(错误!)
我做错了吗?如果它的长值应该足够,为什么我需要将值转换为 BIGINT?还有,为什么 COUNT(id) 和 COUNT(*) 有区别?
谢谢!
【问题讨论】:
-
我看不出
COUNT(*)怎么能返回比COUNT(id)更小的值,如果这是查询中的唯一区别并且基础数据没有改变的话。 -
是的,这是我遇到的一个问题。第二个是如果您比较第一个和第二个 SQL,查询似乎需要 CAST 到 BIGINT。顺便说一句,我在第一个 SQL 语句中有错字,我刚刚更正了。
-
只是补充一下,我的测试之间的数据没有变化。结果与上述陈述一致。