SQL будет реализован:
Код: Выделить всё
select test_version.*
from test_version
join (select identification,
version,
dense_rank()
over (partition by identification order by major_version desc ,minor_version desc ,patch_version desc ) as rank
from test_version) rk
on test_version.identification = rk.identification
where test_version.version = rk.version
and rk.rank = 1;
Код: Выделить всё
package com.example.addtionalcriteriademo;
import jakarta.persistence.*;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
import jakarta.persistence.criteria.Subquery;
import jakarta.persistence.metamodel.Attribute;
import jakarta.persistence.metamodel.MapAttribute;
import lombok.Data;
import org.hibernate.annotations.IdGeneratorType;
import org.hibernate.metamodel.model.domain.internal.MapAttributeImpl;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.repository.NoRepositoryBean;
@SpringBootApplication
@EnableJpaRepositories
public class AdditionalCriteriaDemoApplication {
public static void main(String[] args) {
SpringApplication.run(AdditionalCriteriaDemoApplication.class, args);
}
@Bean
ApplicationRunner runner(TestVersionRepository repository) {
return args -> {
repository.findAll(repository.query()).forEach(System.out::println);
};
}
}
@Data
@MappedSuperclass
class AbstractVersion {
@Id
@GeneratedValue(
strategy = GenerationType.AUTO
)
private int id;
private String identification;
private String version;
private int majorVersion;
private int minorVersion;
private int patchVersion;
}
@Table
@Entity
class TestVersion extends AbstractVersion {
}
@NoRepositoryBean
interface AbstractVersionRepository extends JpaRepository, JpaSpecificationExecutor {
default Specification query() {
return (root, query, cb) -> {
return null;
};
}
}
interface TestVersionRepository extends AbstractVersionRepository {
}
Код: Выделить всё
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.3.4
com.example
additional-criteria-demo
0.0.1-SNAPSHOT
additional-criteria-demo
additional-criteria-demo
17
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
org.postgresql
postgresql
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
Подробнее здесь: https://stackoverflow.com/questions/790 ... -api-query