No LIMIT clause in HQL (Hibernate 3)
July 4th, 2008

在Hibernate 2中习惯了将limit ?, ?语句写在HQL中,使用Hibernate 3时突然发现limit语句不起作用了,hibernate生成的SQL中完全不见limit的踪影,它被忽略了!

limit在分页中可是至关重要的工具。当然某些牛人把整个表都取出来在内存中作分页,我却没有这种魄力。

HQL的文档中也没有提到LIMIT,可能真的是不支持了。不过我们可以用Criteria这个类的setFirstResultsetMaxResults来实现limit。Query接口也有类似的方法。

如果用的是Spring的HibernateTemplate,则可以调用其ss方法来实现相同的功能。

Eclipse 3.4/subclipse 1.4,不要太着急
June 29th, 2008

Eclipse 3.4对于Java开发者来说比较有吸引力。不过我试用了一下,使用相同的JRE的情况下,Eclipse 3.3的默认字体配置更好地显示了中英文混排的文字,而Eclipse 3.4的中文显然比英文要大上一号,不知道在哪里去更改这种行为。界面毕竟是开发者考虑的一个因素,不管比重大小,在意这一点的同志们要注意了,不要急于升级。

差不多同时svn 1.5发布了,而subclipse 1.4就是针对svn 1.5的一次升级。这次升级并不是简单的后台升级,界面也变得似乎更加合理,尤其是commit/revert的对话框文件列表采用了树状结构。然而看起来cool的界面却是中看不中用,实际commit或revert的时候你就会发现,checkbox没了!!!!如果有不想提交的本地文件,我唯一发现的办法就是选中后右键点击,选择“remove from view”。

这真是subclipse的一大败笔。当看到NetBeans看似完美的svn集成却用了那么烂的选择方式时,非常失望。而subclipse却朝着这个方向迈了一大步。不过似乎在文件或目录前面加上丢失的checkbox就可以挽救这个失误,不知道subclipse的开发组会不会这么做。

关于这个对话框的不方便,有人在邮件列表里也提出来了,说现在只好用tortoiseSVN或者命令行来做提交。另外用户们还在邮件列表上提出了许多其它的bug,而我在使用的过程中也不时地看到subclipse抛出的exception.

svn客户端升级到1.5会改变working copy配置文件的结构,所以我还得排除万难降级到subclipse 1.2。而eclipse也用回了稳定的3.3,不知道在NetBeans的压力下匆忙发布的3.4版本里还隐藏着什么陷阱。

org.apache.commons.lang.StringUtils 字符串处理
June 28th, 2008

许多开发人员在做项目时都习惯把一些实用方法做成通用的静态方法,放在一起使用,例如对字符串的处理。有些实际编码中十分常用的方法却没有在Java的String类中提供。实际上Apache的commons子项目的lang包就是帮我们解决这个问题的,比如org.apache.commons.lang.StringUtils这个字符串处理的类。

在发现它之前我自己已经有了一个StringUtil类,而粗略看了几眼它的文档,我的所有方法都在org.apache.commons.lang.StringUtils类中都有,并且考虑得更加周全。

例如split方法,在Java中,用逗号分隔一个字符串”a,,b,c,”,结果是一个长度为5的数组:

["a", "", "b", "c", ""]

而大部分情况下,那些空字符串是不想要的,于是在循环中我们就需要一一判断字符串是不是空的。StringUtils.split方法就帮我们按照这种思路来分割字符串。

许多开发人员抱怨Java没有提供一个join方法,StringUtils.join解决了这个问题。

你怎么判断用户的输入是不是空?如果做完整的验证,应该是:

if (input != null && input.trim().length > 0) {…}

StringUtils.isBlank方法为我们做这样的判断,它会正确处理null和全部空格的情况。

StringUtils类还有许多其它的实用方法,可以适应我们日常编程中的大部分字符串处理。另外commons-lang还提供了一个StringEscapeUtils类,可以帮助你防止SQL injection,在HTML中正常输出用户输入的尖括号等。

虽然我没有仔细看过源代码,不过作为通用的方法,commons-lang对性能的考虑应该比较周到,这一点可以放心。

在KeePass中使用PuTTY
June 26th, 2008

KeePass是一个开源的密码管理器,我一直在用它保存一些毫无规律的密码。它自己生成随机密码的功能也非常完善。

PuTTY是一个小巧、免费并且好用的ssh客户端。secureCRT我也用过,不过不太习惯。唯一觉得PuTTY不好的地方是不能保存密码自动登录。

在KeePass的帮助里有这样的说明

if you globally (i.e. using the Windows Explorer) register PuTTY for ssh:// URLs, KeePass will automatically use PuTTY for ssh:// URLs

然而我不太清楚怎么这样做(Windows是很博大精深的哦)。

不过最后总算折腾出个办法来,可以在KeePass中启动PuTTY并自动输入用户名:

  1. 把PuTTY可执行文件放在KeePass的目录里,即和KeePass可执行文件放在一起
  2. 在KeePass的Options->Setup选项页面,勾选”Use PuTTY for ssh: and telnet: URLs”
  3. 在ssh的密码项中填写用户名,url的格式为ssh://your.tld
  4. 在列表的ssh url上双击即可启动PuTTY打开该ssh站点,并且用户名已经自动填好。或者也可以单击该行后,在窗口下方的详细信息那里点击url
  5. 双击密码项复制密码,粘贴到PuTTY中即可

唯一不知道的是如何让它自动填写密码然后登录,不过我已经知足了。

数据库计算一条记录的名次
June 26th, 2008

有些东西很简单,自己却想不出来。

平时的工作中习惯了把记录排序然后把结果列表排序输出。但是闲的时候我就想,怎么知道某条记录在某种排序方式下面的排位(名次)呢?

在国外一个blog里看到办法的时候,感觉自己真是愚蠢。而在该blogger提出这个问题让大家留言回答的时候,许多人都想的是非常复杂的办法,包括存储过程、临时表。

国内无法正常访问该blog,实际上思想很简单,该条记录的位置就是它前面的记录数加一。其实这不正是名次的定义吗?真是羞愧……这个问题我想了很久,想不到一个合理的办法……

收到Amazon的书
June 23rd, 2008

一个多月前的post,今天才发现在draft里,像我这样惜字如金的,自然不能把它扔掉了,拿出来充个数,哈哈

4月27号在Amazon订购的一本书,今天(5月12日)就收到了。因为今天是周一,所以可能周末就已经到了。

当时Amazon.com上track packages显示Delivery estimate: May 31, 2008,实际上一般用不了这么久的。我选择的是Standard International Shipping.

外面的灰色盒子显得很破,上面印着amazon.com的标志,运输过程中也被压得变形扭曲了。不过打开盒子,订购的书和一张硬纸板一起被较厚的塑料塑封起来,保存得很完好。记得有一次在china-pub买书选择了加硬包装,也就是在盒子里塞了些废纸而已。

不到万不得已,还是不要在那里买书,一般的书都比较贵,很多在国外读书的同学都是在国内买了书带过去。另外运费对我们国内消费者来说也很高,即使是最慢的shipping。我要的书在国内完全找不到,才去那里买的。