2015-09-21 82 views
0

我使用HSQLDB 2.3.3来实验未预期的结果。
我的表架构是:HSQLDB中的SQL select语句和where子句

CREATE TABLE job_schedule ( 
job_id BIGINT NOT NULL PRIMARY KEY, 
job_name VARCHAR(36) NOT NULL, 
job_group VARCHAR(36) NOT NULL, 
job_start BIGINT NOT NULL, 
job_data VARCHAR(255) NULL, 
job_body CLOB NULL) 

CREATE UNIQUE INDEX idx_job_schedule_name ON job_schedule 
(job_name, job_group) 

我使用HSQL数据库管理器来选择表中的所有行:

SELECT * FROM job_schedule 

JOB_ID JOB_NAME        JOB_GROUP       JOB_START  JOB_DATA                          JOB_BODY 
------ ------------------------------------ ------------------------------------ ------------- ------------------------------------------------------------------------------------------------------------ -------- 
79  cb9b5abe-f6b6-4670-a702-5bec4f6b9217 edab5d78-3533-11e5-a151-feff819cdc9f 1442848923391 {"duration":69,"start":0,"channel":"ba981e18-e2d8-42ce-a7af-147ff40f075f","content":"360449L0E0ZqbNnH.mp4"}   
80  a0e49194-c01c-4c77-ac4c-95f60bd3528b edab5d78-3533-11e5-a151-feff819cdc9f 1442848866000 {"duration":57,"start":0,"channel":"ba981e18-e2d8-42ce-a7af-147ff40f075f","content":"294913LWi2e1RuY9e.mp4"}   

我的Java程序使用下面的类(即延伸的Spring框架4.2.0类):

@Transactional(propagation = Propagation.REQUIRED) 
public class DefaultJobManager extends JdbcDaoSupport { 
    private DefaultJobManager.QueryIdSql myQueryIdSql; 

    @Override 
    protected void initTemplateConfig() { 
     JdbcTemplate db = getJdbcTemplate(); 
     myQueryIdSql = new DefaultJobManager.QueryIdSql(db); 
    } 

    @Transactional(readOnly = true) 
    public List<Long> listJobs(long startMin, long startMax) { 
     return myQueryIdSql.execute(startMin, startMax); 
    } 

    private static final class QueryIdSql extends MappingSqlQuery<Long> { 
     QueryIdSql(JdbcTemplate db) { 
     setJdbcTemplate(db); 
     setSql("select job_id from job_schedule " + 
       "where job_start between ? and ?"); 
     setResultSetType(ResultSet.TYPE_FORWARD_ONLY); 
     setUpdatableResults(false); 
     declareParameter(new SqlParameter(Types.BIGINT));  
     declareParameter(new SqlParameter(Types.BIGINT)); 
     compile(); 
    } 

    protected Long mapRow(ResultSet rs, int rowNum) throws SQLException { 
     return rs.getLong(1); 
    } 
} 

listJobs(1442848866000L, 1442848923391L)只有一个项目返回List的方法。

的HSQLDB产生db.sql.log文件,在这个文件中,我可以读到:

select job_id from job_schedule where job_start between ? and ? (1442848866000,1442848923391) 
+0

对不起,我试图隔离我在HSQLDB中的问题,但我犯了一个愚蠢的错误。我刚刚完成了我的问题已经开始的Java程序的帖子。 –

回答

0

的问题是在我使用Spring JDBC的,而不是在HSQLDB。
DefaultJobManager类(延伸JdbcDaoSupport),我使用的延伸RdbmsOperation和在它们中的一些我的maxRows属性设置为1,但是该属性被传播到JdbcTemplate对象的相应属性多个类,以及我共享JdbcTemplate实例拥有的DefaultJobManager对象全部RdbmsOperation对象。
RdbmsOperation传播到JdbcTemplate的其他性质是fetchSizequeryTimeout
如果您想对RdbmsOperation对象进行一些调整,您应该让它使用其默认的JdbcTemplate实例。您可以在RdbmsOperation对象中共享DataSource对象,但不能共享对象中的JdbcTemplate对象。