当前位置: 首页 > 知识库问答 >
问题:

如何在JPA存储库中编写动态查询?使用Java springboot。规范就是答案吗?

岳彬炳
2023-03-14

我在JPA仓库中有一个项目。我想从两个表中检索值,使用UNION和一个响应参数,我成功地使用了下面的本地查询。

Public interface resultRepository extends JpaRepository<Result, String>{


@Query(value= “SELECT ‘This is from Table 1’ AS MSG, COLUMN1, COLUMN2 COLUMN3, COLUMN4, COLUMN5 FROM TABLE1 
WHERE COLUMN1 = :column1 AND COLUMN2 = :column2 AND COLUMN3 = :column3 
UNION
SELECT ‘This is from Table 2’ AS MSG, COLUMN1, COLUMN2 COLUMN3, COLUMN4, COLUMN5 FROM TABLE2
WHERE COLUMN1 = :column1 AND COLUMN2 = :column2 AND COLUMN3 = :column3 ”, nativeQuery = true)
List<Result> getResultByParameters(@Param(“column1”) String column1, 
    @Param(“column2’)String column2,@Param(“column3’) String column3);

}

我的问题是。我希望“在哪里”条款是动态的。这样他们就可以通过这些参数中的任何一个进行搜索。它的列1和列2还是列2和列3。在我的前端,这些列参数将为NULL。使用本机查询,我无法决定选择使用什么参数。

我正在阅读这个链接中的规格说明。https://dimitr.im/writing-dynamic-queries-with-spring-data-jpa

但我一点也不明白。我还能收到自定义消息(MSG)吗?或者甚至使用union搜索多个表?

共有2个答案

梁俊友
2023-03-14

因此,有很多方法可以在JPA中创建动态查询。让我们先列出其中的几个:

  1. 自定义存储库
  2. 规格
  3. JPA存储库中的自定义查询(您已经编写了,但我将向您展示更灵活的解决方案
  4. 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
    }
}

规格

下一个是规范(正如您已经提到的)。我不会在这里详细解释规范,因为在你们分享的教程链接中已经解释过了。但是,如果不想自己编写SQLs,可以使用规范创建动态查询。但我想你不能有定制的投影(定制select子句,就像你想要的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子句做了什么。

查询

它同样类似于Criteria API,但语法不同且更简单。也可以使用QueryDSL创建类型安全的动态查询。以下是详细解释QueryDSL的链接-https://www.baeldung.com/querydsl-with-jpa-tutorial

罗智志
2023-03-14

e、 g.您可以如下更改SQL请求where子句

WHERE COLUMN1 IN (:column1, :column3, :column3) OR COLUMN2 IN (:column1, :column3, :column3) OR COLUMN3IN (:column1, :column3, :column3) 

WHERE (:column1 IS NULL OR COLUMN1 = :column1) OR (:column1 IS NULL OR COLUMN2 = :column2) OR (:column1 IS NULL OR COLUMN3 = :column3)

这取决于你想要什么样的逻辑

 类似资料:
  • 目前我一直在使用以下Spring JPA存储库自定义查询, 我需要修改这个查询时,筛选文本将是逗号分隔的值。但按照以下方式,它将是一个动态查询,我如何执行它。 我需要构建动态查询,

  • 如何使用@ Query(value = " SELECT * FROM do _ not _ track WHERE(user _ id = 7)AND(' 2022-06-25 ' BETWEEN FROM _ date AND to _ date)OR(' 2022-06-30 ' BETWEEN FROM _ date AND to _ date)",nativeQuery = true)在

  • 问题内容: 谁能帮助我获取下面提到的JPA查询的JPA标准查询。 问题答案: 假设Person与语言有关,这就是您在较早的Hibernate中所做的事情: 我第一次尝试使用JPA 2.0: 请让我知道这是否适合您。 编辑: 更新查询以仅使用一个呼叫。

  • 问题内容: 问题答案: 这是从MySQL数据库知识库中获得的: LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT接受一个或两个数字参数,这两个参数都必须是非负整数常量(使用预处理语句时除外)。 为了使查询正常工作,您需要将其编写为 准备好的语句 ,然后执行该 语句 。

  • 如何在一个类中创建和实例化jpa存储库?我现在的情况是,我必须在一个泛型类中为不同的实体创建存储库。 我可以很容易地为Neo4j存储库这样做, 对于JpaRepostory,我检查了留档,发现了这个, 我不确定如何在上面的代码中实例化工厂。 另外,我不能像为Neo4j那样通过指定域类来创建存储库吗?