Spring 使用Java持久性查询语言按顺序查找差距
在我的表中,有一列的行为类似于序列,只是它不是自动递增的,递增是在代码中完成的 该表的粗略表示如下所示: 身份证件 水果 序列 1. 苹果 1. 2. 苹果 2. 3. 苹果 3. 4. 苹果 10 5. 橙色 1. 6. 橙色 2.Spring 使用Java持久性查询语言按顺序查找差距,spring,spring-boot,jpa,spring-data-jpa,Spring,Spring Boot,Jpa,Spring Data Jpa,在我的表中,有一列的行为类似于序列,只是它不是自动递增的,递增是在代码中完成的 该表的粗略表示如下所示: 身份证件 水果 序列 1. 苹果 1. 2. 苹果 2. 3. 苹果 3. 4. 苹果 10 5. 橙色 1. 6. 橙色 2. 简而言之,答案是否定的。JPA和JPQL并不是用于像您这样的目的。您所遵循的解决方案不是关于JPA,而是关于MySQL问题,并相应地对其进行了标记。为什么不将此计算移到服务层?在这种情况下,您将自动摆脱DBMS依赖性问题。 例如: public interface
简而言之,答案是否定的。JPA和JPQL并不是用于像您这样的目的。您所遵循的解决方案不是关于JPA,而是关于MySQL问题,并相应地对其进行了标记。为什么不将此计算移到服务层?在这种情况下,您将自动摆脱DBMS依赖性问题。 例如:
public interface FruitRepository extends CrudRepository<Fruit, Long> {
@Query("select f.sequence from Fruit f where f.fruit = :name order by f.sequence"
List<Long> getSequencesByFruitName(@Param("name") String fruitName);
}
简而言之,答案是否定的。JPA和JPQL并不是用于像您这样的目的。您所遵循的解决方案不是关于JPA,而是关于MySQL问题,并相应地对其进行了标记。为什么不将此计算移到服务层?在这种情况下,您将自动摆脱DBMS依赖性问题。 例如:
public interface FruitRepository extends CrudRepository<Fruit, Long> {
@Query("select f.sequence from Fruit f where f.fruit = :name order by f.sequence"
List<Long> getSequencesByFruitName(@Param("name") String fruitName);
}
您可以使用以下查询查找序列中的“最低”间隙:
SELECT MIN(s1.sequence) + 1
FROM FruitSequence s1
WHERE NOT EXISTS(
SELECT id FROM FruitSequence s2
WHERE s1.fruit = s2.fruit
AND s1.sequence + 1 = s2.sequence)
您可以重复使用此查询来获取后续的免费ID。如果使用Hibernate,您甚至可以使用不相关的联接来代替
EXISTS
运算符。您可以使用以下查询来查找序列中的“最低”间隙:
SELECT MIN(s1.sequence) + 1
FROM FruitSequence s1
WHERE NOT EXISTS(
SELECT id FROM FruitSequence s2
WHERE s1.fruit = s2.fruit
AND s1.sequence + 1 = s2.sequence)
您可以重复使用此查询来获取后续的免费ID。如果使用Hibernate,您甚至可以使用不相关的联接来代替
EXISTS
操作符。这是一种方法,但这里的问题是性能。内存中有20000项比执行sql查询慢得多。但我想永远都是这样。。。谢谢你!这是一种方法,但这里的问题是性能。内存中有20000项比执行sql查询慢得多。但我想永远都是这样。。。谢谢你!这不会得到范围,只有第一个和最低的间隔,对吗?对,虽然已经获得了范围的低端,但是写一个(非常类似的)查询来查找高端是很容易的,我猜,但是如果序列中有多个间隔,它会变得有点棘手…怎么会呢?您正在寻找比没有前置序列号的低端序列号大的最低序列号(与上面查询中的后续序列号相反)。间隔的数量无关紧要。假设你首先找到序列1到3,这可以用最小值和最大值来完成。但是你也有一个6-10的间隔。我想这并不难,因为你可以多次查询。这不会得到范围,只有第一个和最低的差距,对吗?对,虽然已经得到了范围的低端,但写一个(非常类似的)查询来找到高端我想,但是如果序列中有多个间隙,它会变得有点棘手…怎么会这样呢?您正在寻找比没有前置序列号的低端序列号大的最低序列号(与上面查询中的后续序列号相反)。间隔的数量无关紧要。假设你首先找到序列1到3,这可以用最小值和最大值来完成。但是你也有一个6-10的间隔。我想这并不难,因为你可以多次查询。