当registrationNo是String时,`Projections.max(" registrationNo")`将如何工作

时间:2015-11-24 12:27:41

标签: java mysql hibernate

我有一个名为StudentDetails的实体。其中有一个类型为String的字段RegistrationNo。我的客户端遵循xxxxx-xxxx(序列号00000到10000)之类的模式 - (当前年份)数量)。要将RegistrationNo存储在此模式中,我们将其声明为String。每次加入新学生时,我们都必须增加存储它的序列号。

我尝试不知道它存储为字符串我试图使用Projections.max("registrationNo")获取最后一个数字幸运的是它返回了最大数字我不知道如何。但是当序列号达到6位数时仍然会出现问题xxxxxx-xxxx然后Projections.max("registrationNo") 返回6位数字。它只返回最多5位数字。

投影如何返回最多5位数而不是6位数

顺便说一下,我使用记录的id解决了这个问题,以便知道最后RegistrationNo。但是Projections.max("registrationNo")让我感到困惑,因为它在某个时候是如何运作的。

1 个答案:

答案 0 :(得分:2)

正如评论中已经说明的那样,问题很可能是字符串比较,即在字符串类型的属性上调用max()将导致"最大值"返回字符串值,即使这些字符串代表数字。

字符串比较通常是通过比较从开始到结束的字符直到存在差异或达到一个输入字符串的结尾来完成的(在这种情况下,较长的字符串将是较大的字符串)。

因此,只要您的序列号具有相同的长度,它就应该有效,因为比较1000000001将导致"正确"被比较的人物。

但是,一旦字符串长度不同,正常的字符串比较就不再有效,因为字符确实代表不同的数字。因此,将98765123456进行比较会导致98765更大,因为要比较的第一个字符将是191 < 9差不多所有的时间(除非你以某种方式改变了)。

要解决此问题,您可以采取一些取决于您的环境和目标的路线:

  • 将序列号存储在单独的数字属性
  • 从一开始就使序列字符串更长,即允许更大的范围
  • 在代码或数据库中添加一个专门的比较器(就像提示一样,我必须查找如何操作)

从表现的角度来看,我可能采取第一条路线。