因此在 JPA 中创建动态查询的方法有很多种。让我们首先列出其中的一些:
- 自定义存储库
- 规格
- JPA 存储库本身中的自定义查询(您已经编写过,但我将向您展示更灵活的解决方法)
- QueryDSL
自定义存储库
在这种方法中,基本上您创建一个接口,并在其中声明自定义方法。然后将此接口扩展为实际的存储库接口,并手动实现它。这是处理自定义查询的最灵活的方式。下面是示例:
public interface CustomRepository {
public Result myCustomQueryMethod(String params);
}
public interface ResultRepository extends JpaRepository<Result, Long>, CustomRepository { ... }
public class CustomRepositoryImpl implements CustomRepository {
@Autowired //@PersistentContext
private EntityManager entityManager;
public Result myCustomQueryMethod(String params) {
String nativeSql = "...";
// create query, execute it, and transform the results to object using object mapper or manually
}
}
规格
下一个是规格(正如您已经提到的)。我不会在这里对规格进行深入解释,因为它已经在您共享的教程链接中进行了解释。但是,如果您不想自己编写 SQL,您可以使用规范创建动态查询。但我猜你不能有自定义投影(自定义选择子句,如你想要的 MSG 参数)和规范。
JPA 存储库中的自定义查询
以下是您的查询的稍微修改版本,如果您要搜索的参数数量(在 where 子句中)固定,则它可以满足您的目的:
@Query(value= “SELECT ‘This is from Table 1’ AS MSG, COLUMN1, COLUMN2 COLUMN3, COLUMN4, COLUMN5 FROM TABLE1
WHERE (:column1 is null or COLUMN1 = :column1) AND (:column2 is null or COLUMN2 = :column2) AND (:column3 is null or COLUMN3 = :column3)
UNION
SELECT ‘This is from Table 2’ AS MSG, COLUMN1, COLUMN2 COLUMN3, COLUMN4, COLUMN5
FROM TABLE2
WHERE (:column1 is null or COLUMN1 = :column1) AND (:column2 is null or COLUMN2 = :column2) AND (:column3 is null or COLUMN3 = :column3) ”, nativeQuery = true)
List<Result> getResultByParameters(@Param(“column1”) String column1,
@Param(“column2’)String column2,@Param(“column3’) String column3);
看看我对 where 子句做了什么。
QueryDSL
它又与 Criteria API 类似,但语法不同且更简单。您也可以使用 QueryDSL 创建类型安全的动态查询。这是更详细地解释 QueryDSL 的链接 -https://www.baeldung.com/querydsl-with-jpa-tutorial https://www.baeldung.com/querydsl-with-jpa-tutorial