Java 按多个条件拆分列表
使用hibernate,我从一个示例表Java 按多个条件拆分列表,java,sql,oracle,hibernate,Java,Sql,Oracle,Hibernate,使用hibernate,我从一个示例表ANIMALS中获得了一个结果列表。hibernate方法如下所示: ... List<Animals> animalList= null; try { Query query = session.createQuery("SELECT * FROM animals ORDER BY COLOR , HEIGHT , AGRESSIVE; "); animalList= query.
ANIMALS
中获得了一个结果列表。hibernate方法如下所示:
...
List<Animals> animalList= null;
try {
Query query = session.createQuery("SELECT * FROM animals ORDER BY COLOR , HEIGHT , AGRESSIVE; ");
animalList= query.list();
}
...
我的实际结果列表至少有100000条记录,因此解析列表并执行list.add(..)
不是很明智;
我想做的是将结果集拆分为8个较小的列表,其中包含颜色
、高度
和攻击性
的每个组合。
之后,列表将作为参数提供给方法,以便执行一系列操作
我只能使用Java1.6或更低版本。
我的主要目标是摆脱我采取的IndexOutOfBounds
措施和IF的疯狂行为,如以下所示:
NAME COLOR HEIGHT AGRESSIVE
---------------------------------
JIMMY BLACK SHORT NO
RIPPER BLACK SHORT YES
GOOFY BLACK TALL NO
MURPHY BLACK TALL YES
PAUL WHITE SHORT NO
ROB WHITE SHORT YES
BOBBY WHITE TALL NO
JACK WHITE TALL YES
for (int i = 0; i < animalList.size(); i++) {
previousAnimal = animals.get(i-1);
currentAnimal = animals.get(i);
nextAnimal = animals.get(i+1);
...//extra code
IF ( previousAnimal.getColor() != currentAnimal.getColor() || previousAnimal.getHeight() != currentAnimal.getColor() || previousAnimal.getAgressive() != currentAnimal.getAgressive() )
...//extra code
IF ( currentAnimal.getColor() != nextAnimal.getColor() || currentAnimal.getHeight() != nextAnimal.getColor() || currentAnimal.getAgressive() != nextAnimal.getAgressive() )
...//extra code
NAME COLOR HEIGHT AGRESSIVE GRP
-------------------------------------
JIMMY BLACK SHORT NO 1
RIPPER BLACK SHORT YES 2
GOOFY BLACK TALL NO 3
MURPHY BLACK TALL YES 4
PAUL WHITE SHORT NO 5
ROB WHITE SHORT YES 6
BOBBY WHITE TALL NO 7
JACK WHITE TALL YES 8
for(int i=0;i
也许您可以使用稠密等级
分析功能来识别具有相似特征的动物:
...
List<Animals> animalList= null;
try {
Query query = session.createQuery("SELECT a.*, DENSE_RANK() OVER (ORDER BY COLOR, HEIGHT, AGRESSIVE) GRP FROM animals a ORDER BY COLOR, HEIGHT, AGRESSIVE; ");
animalList= query.list();
}
...
其中,Color
、Height
和Aggressive
的每个不同组合将为GRP
列生成一个不同的值。然后,您可以简化其他代码:
for (int i = 0; i < animalList.size(); i++) {
previousAnimal = animals.get(i-1);
currentAnimal = animals.get(i);
nextAnimal = animals.get(i+1);
...//extra code
IF ( previousAnimal.getGrp() != currentAnimal.getGrp() )
...//extra code
IF ( currentAnimal.getGrp() != nextAnimal.getGrp() )
...//extra code
for(int i=0;i
也许您可以使用稠密等级
分析功能来识别具有相似特征的动物:
...
List<Animals> animalList= null;
try {
Query query = session.createQuery("SELECT a.*, DENSE_RANK() OVER (ORDER BY COLOR, HEIGHT, AGRESSIVE) GRP FROM animals a ORDER BY COLOR, HEIGHT, AGRESSIVE; ");
animalList= query.list();
}
...
其中,Color
、Height
和Aggressive
的每个不同组合将为GRP
列生成一个不同的值。然后,您可以简化其他代码:
for (int i = 0; i < animalList.size(); i++) {
previousAnimal = animals.get(i-1);
currentAnimal = animals.get(i);
nextAnimal = animals.get(i+1);
...//extra code
IF ( previousAnimal.getGrp() != currentAnimal.getGrp() )
...//extra code
IF ( currentAnimal.getGrp() != nextAnimal.getGrp() )
...//extra code
for(int i=0;i
如果您使用的是Java 8,则可以使用流API。如果您使用的是Java 7或更早版本,则可以使用quaere或Similar之类的库筛选查询,您可以使用Criteria API的条件,或将所有内容放入多映射中,并使用一个键,该键是具有一致hascode()的属性元组
method。您是否对整个集合感兴趣,并希望将其过滤到不同的数据结构中在SQL查询之后,还是您希望从基于某些条件获得的1000000条记录中获得一个小集合?@uıɥɔɐɯ无论结果是用SQL还是用JAVA拆分都没有关系。我只对最快的解决方案感兴趣。我无法在查询中对某个属性进行过滤,因为随着时间的推移,这些属性可能会变成蓝色和红色如果您使用的是Java 8,那么您可以使用流API,而不是黑白的。如果您使用的是Java 7或更早版本,那么可以使用quaere或Similar之类的库过滤查询,您可以使用Criteria API的条件,或者将所有内容放在多映射中,并使用一个键,该键是具有一致属性的元组code()
方法。您是否对整个集合感兴趣,并希望将其筛选到不同的数据结构中在SQL查询之后,还是您希望从基于某些条件获得的1000000条记录中获得一个小集合?@uıɥɔɐɯ无论结果是用SQL还是用JAVA拆分都没有关系。我只对最快的解决方案感兴趣。我无法在查询中对某个属性进行过滤,因为随着时间的推移,这些属性可能会变成蓝色和红色而不是黑白左右。。。