Зависимость персистентности Jakarta, предоставляемая Spring, изменяется с версии 3.1.0 на версию 3.2.0.
В базе кода используется ряд предикатов персистентности для поиска в репозиториях Spring, а также довольно много спецификаций LIKE, созданных программным способом.
Например, для простой сущности:
Код: Выделить всё
@Entity
@Table(name = TABLE_NAME)
public class MyEntity {
static final String TABLE_NAME = "MY_TABLE";
static final String COL_NAME_FOO = "foo";
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = COL_NAME_FOO)
private String foo;
}
... и репозиторий JPA, похожий на:
Код: Выделить всё
interface MyEntityRepository extends JpaRepository,
JpaSpecificationExecutor {
}
id
foo
1
bar
... и следующая спецификация «нравится»:
Код: Выделить всё
Specification byFoo() {
return (root, query, cb) -> cb.like(
root.get(MyEntity_.FOO),
Specifications.like("bar"));
}
например. myRepository.findAll(byFoo().toPredicate(root,query,cb))
К сожалению, те же самые условия и идиома перестали работать с Spring boot 4 / jakarta-persistence 3.2.0, а вызов findAll, параметризованный с той же спецификацией -> предикат, не может получить одну строку.
Я не нашел ни одной литература предупреждает о потенциальных ошибках или соответствующих синтаксических изменениях.
Есть ли какое-либо обоснование для этого / может быть, стоит попробовать альтернативную идиому?
Примечание: я просмотрел сгенерированный подготовленный оператор и не увидел существенных отличий - единственное отличие заключается в том, что версия 3.2.0 добавляет escape '' в конце запроса.