Java 当registrationNo为字符串时,`Projections.max(";registrationNo";)将如何工作
我有一个名为Java 当registrationNo为字符串时,`Projections.max(";registrationNo";)将如何工作,java,mysql,hibernate,Java,Mysql,Hibernate,我有一个名为StudentDetails的实体。其中有一个字符串类型的字段RegistrationNo。我的客户机遵循类似xxxxx-xxxx(序列号00000到10000)-(当前年份号)的模式。要在此模式中存储注册号,我们将其声明为字符串。每次新学员加入时,我们必须增加序列号,我们必须存储它 我在不知道它存储为字符串的情况下尝试使用Projections.max(“registrationNo”)获取最后一个数字,幸运的是,它返回了max number,我不知道如何返回。但当序列号达到6位数
StudentDetails
的实体。其中有一个字符串类型的字段RegistrationNo
。我的客户机遵循类似xxxxx-xxxx(序列号00000到10000)-(当前年份号)的模式。要在此模式中存储注册号,我们将其声明为字符串。每次新学员加入时,我们必须增加序列号,我们必须存储它
我在不知道它存储为字符串的情况下尝试使用Projections.max(“registrationNo”)
获取最后一个数字,幸运的是,它返回了max number,我不知道如何返回。但当序列号达到6位数字(如xxxxxx-xxxx)时,问题再次出现,然后Projections.max(“registrationNo”)
没有返回6位数字。它最多只返回5位数字
投影如何返回最多5位数字而不是6位数字
顺便说一句,我用记录的id来知道最后的
RegistrationNo
,解决了这个问题。但是Projections.max(“RegistrationNo”)
让我困惑了一段时间它是如何工作的。如注释中所述,这个问题很可能是字符串比较,即调用max()
对字符串类型的属性执行操作将返回“最大”字符串值,即使这些字符串表示数字
字符串比较通常是通过从头到尾比较字符来完成的,直到出现差异或到达一个输入字符串的末尾(在这种情况下,越长的字符串越大)
因此,只要序列号的长度相等,它就应该起作用,因为比较10000
和00001
将得到比较的“正确”字符
但是,一旦字符串长度不同,正常的字符串比较将不再有效,因为字符确实代表不同的数字。因此,将98765
与123456
进行比较将导致98765
更大,因为要比较的第一个字符几乎总是1
和9
以及1<9
(除非您以某种方式更改)
要解决这个问题,您可以根据您的环境和目标采取以下几条路线:
- 将序列号存储在单独的数字属性中
- 使序列字符串从一开始就更长,即允许更大的范围
- 在代码或数据库中添加一个专门的比较器(作为提示,我必须查找如何执行)
从性能的角度来看,我可能会选择第一条路线。如果您的属性是字符串(我认为这是由于格式问题)
max
将进行字符串比较。所以1000000
将小于2
,因为1<2
@Thomas那么01000将如何大于00002..这是因为1>0
。字符串比较将比较字符,即,如果您比较010
和002
,它将实际比较0
和0
,然后比较1
和0
,因为它们是不同的,比较将停止。哦..明白了..当位数相同时,它将起作用。如果位数改变,则它将不起作用..谢谢..将您的评论作为答案发布,我将接受它。