Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用Java持久性查询语言按顺序查找差距_Spring_Spring Boot_Jpa_Spring Data Jpa - Fatal编程技术网

Spring 使用Java持久性查询语言按顺序查找差距

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

在我的表中,有一列的行为类似于序列,只是它不是自动递增的,递增是在代码中完成的

该表的粗略表示如下所示:

身份证件 水果 序列 1. 苹果 1. 2. 苹果 2. 3. 苹果 3. 4. 苹果 10 5. 橙色 1. 6. 橙色 2.
简而言之,答案是否定的。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的间隔。我想这并不难,因为你可以多次查询。