小弟我在使用hibernate的native sql查询时,发现一个很怪的问题
两个表,一对多的关系,用外键关联
建表语句:
DROP TABLE IF EXISTS `traffic`.`devices`;
CREATE TABLE  `traffic`.`devices` (
  `device_id` int(10) unsigned NOT NULL auto_increment,
  `ipaddress` varchar(45) NOT NULL,
  `mac` varchar(45) NOT NULL,
  `vpnname` varchar(45) NOT NULL,
  `vpnmac` varchar(45) NOT NULL,
  `createtime` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `isactive` varchar(45) NOT NULL,
  `username` varchar(45) default NULL,
  PRIMARY KEY  (`device_id`),
  KEY `Index_devices` (`ipaddress`,`mac`,`createtime`,`username`,`vpnname`,`vpnmac`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;DROP TABLE IF EXISTS `traffic`.`syslog`;
CREATE TABLE  `traffic`.`syslog` (
  `syslog_id` int(10) unsigned NOT NULL auto_increment,
  `logcategory` varchar(45) NOT NULL,
  `securitylevel` varchar(45) NOT NULL,
  `action` varchar(45) NOT NULL,
  `type` varchar(45) NOT NULL,
  `srcip` varchar(45) NOT NULL,
  `dstip` varchar(45) NOT NULL,
  `srcport` varchar(45) NOT NULL,
  `dstport` varchar(45) NOT NULL,
  `protocol` varchar(45) NOT NULL,
  `message` varchar(500) NOT NULL,
  `createtime` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `ext1` varchar(45) default NULL,
  `ext2` varchar(45) default NULL,
  `ext3` varchar(45) default NULL,
  `device_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`syslog_id`),
  KEY `Index_syslog` (`device_id`,`createtime`),
  CONSTRAINT `FK_syslog_device_id` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
使用bufferstring拼接了一条查询语句,是一条比较长的内联接语句
 SELECT device_id,mac,page.syslog_id,username,page.createtime,page.type,page.srcip,mac,page.logcategory,page.securitylevel,page.action,page.message FROM devices dv inner join (
 select device_id,syslog_id,createtime,type,srcip,logcategory,action,securitylevel,message from syslog s where s.createtime between '2009-06-03' and '2009-08-07'  and type in (8192,16384,32768,65536,131072)
  order by s.createtime asc limit 0 , 5 )  as page using(device_id) where 1=1这样写是因为考虑到可以使用syslog建立的索引createtime字段,如果单纯的内联查询,速度超级慢
但是,当我想使用setString()方法来设置"asc","desc"的内容时,却无法设置成功(总是默认的asc排序)
但是数据库里面却可以运行成功
而且更奇怪的是,limit命令,明明有5条记录,比如limit 0,5 ,有时候却只能取出来3条或者4条。
代码如下:
StringBuffer sb = new StringBuffer();
sb.append(" select device_id,mac,page.syslog_id,username,page.createtime,page.type,page.srcip,mac,page.logcategory,page.securitylevel,page.action,page.message FROM devices dv inner join ( ");
sb.append(" select device_id,syslog_id,createtime,type,srcip,logcategory,action,securitylevel,message from syslog s where s.createtime between :fromdate and :todate ");

if(type!=null && !"".equals(type.trim()) && !"ALL".equalsIgnoreCase(type)){
sb.append(" and type= :type ");
}else{

sb.append(" and type in (8192,16384,32768,65536,131072) ");
}

if(ipaddress!=null && !"".equals(ipaddress.trim())){
sb.append(" and srcip = :ipaddress ");
}

if(soft!=null && !"".equals(soft.trim())){
sb.append(" and logcategory = :soft ");
}

if (orderBy != null && !"".equals(orderBy)) {
if("type".equalsIgnoreCase(orderBy)) {
orderBy = "s.type";
} else if ("soft".equalsIgnoreCase(orderBy)) {
orderBy = "s.logcategory";
}else
{
orderBy = "{s}.createtime";
}
if (orderDesc != null && orderDesc) {
orderby="DESC";
} else {
orderby="ASC";
}
}

sb.append(" order by :orderBy :sort limit :st, :rc ) as page using(device_id) where 1=1 ");


if(srcmac!=null && !"".equals(srcmac.trim())){
sb.append(" and mac = :srcmac ");

}

if(mac!=null && !"".equals(mac) && !"ALL".equalsIgnoreCase(mac)){
sb.append(" and vpnmac = :mac ");
}

if(username!=null && !"".equals(username.trim())){
sb.append(" and username = :username " );

}


Query qu=hsession.createSQLQuery((String)sb.toString());//sql created
  

  qu.setTimestamp("fromdate", fromdate);
  qu.setTimestamp("todate", todate);


  if(type!=null && !"".equals(type.trim()) && !"ALL".equalsIgnoreCase(type)){
  qu.setString("type", type);
  }
  
  if(ipaddress!=null && !"".equals(ipaddress.trim())){
   qu.setString("srcip", ipaddress);

}
  
  if(soft!=null && !"".equals(soft.trim())){
  qu.setString("logcategory", soft);

}
  

  qu.setString("orderBy", orderBy);
  qu.setString("sort", orderby);
  qu.setInteger("st", startRec);
  qu.setInteger("rc", endRec);

  if(srcmac!=null && !"".equals(srcmac.trim())){

qu.setString("mac", srcmac);
}
  
  if(mac!=null && !"".equals(mac) && !"ALL".equalsIgnoreCase(mac)){
  qu.setString("vpnmac", mac);

}
  if(username!=null && !"".equals(username.trim())){
  qu.setString("username", username);

}
  
  list=qu.list();
请哪位帮忙看看,问题在哪里?