Spring 数据 JPA 按 属性 排序,无硬编码
Spring Data JPA sorting by property without hardcoding
我的实体有多个字段:
public class Some {
private Foo foo;
private Bar bar;
}
我想要有能够根据请求按 foo 排序和按 bar 排序的代码。我知道有一个工具可以像这样使用:
Sort sort = Sort.by(Sort.Direction.DESC, "foo");
Pageable pageable = PageRequest.of(page, limit, sort);
但这种方法似乎并不完美,因为字段名称是硬编码的,并且在某些字段名称被更改并且开发人员忘记更新此排序代码的情况下,在编译/启动阶段一切看起来都很好,但会失败在运行期间。
是否可以有替代解决方案而无需硬编码并多次复制相同的方法来更改 jpql 查询?
如果您不想使用 String
作为名称,您可以使用 JPA 元模型。您还可以使用带有条件 API.
的创建查询的元模型
Here 是一个很好的博客 post,它解释了如何生成和使用 JPA 条件元模型。但简而言之,它归结为向编译器添加一个 Maven 插件(或者 Gradle,如果你使用它)。在编译期间,它现在将生成元模型。
你的样本 class(es)
public class Some {
private Foo foo;
private Bar bar;
}
它将生成一个 Some_
class,然后您可以使用它来获取属性的名称。 Some_.FOO
将 link 添加到 foo
属性。现在,如果您将 foo
重命名为 bar
,编译将失败,因为 Some_FOO
不再可用。
我的实体有多个字段:
public class Some {
private Foo foo;
private Bar bar;
}
我想要有能够根据请求按 foo 排序和按 bar 排序的代码。我知道有一个工具可以像这样使用:
Sort sort = Sort.by(Sort.Direction.DESC, "foo");
Pageable pageable = PageRequest.of(page, limit, sort);
但这种方法似乎并不完美,因为字段名称是硬编码的,并且在某些字段名称被更改并且开发人员忘记更新此排序代码的情况下,在编译/启动阶段一切看起来都很好,但会失败在运行期间。
是否可以有替代解决方案而无需硬编码并多次复制相同的方法来更改 jpql 查询?
如果您不想使用 String
作为名称,您可以使用 JPA 元模型。您还可以使用带有条件 API.
Here 是一个很好的博客 post,它解释了如何生成和使用 JPA 条件元模型。但简而言之,它归结为向编译器添加一个 Maven 插件(或者 Gradle,如果你使用它)。在编译期间,它现在将生成元模型。
你的样本 class(es)
public class Some {
private Foo foo;
private Bar bar;
}
它将生成一个 Some_
class,然后您可以使用它来获取属性的名称。 Some_.FOO
将 link 添加到 foo
属性。现在,如果您将 foo
重命名为 bar
,编译将失败,因为 Some_FOO
不再可用。