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

2024-01-16

我在 JPA 存储库中有一个项目。我想使用 UNIONS 和响应参数从两个表中检索值,并且我成功执行了以下本机查询。

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);

}

我的问题是。我希望“Where”子句是动态的。这样他们就可以通过任何这些参数进行搜索。无论是column1和column2还是column2和column3。在我的前端中,这些列参数将为 NULL。使用本机查询我无法决定选择哪些参数正在使用什么。

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

但我根本不明白。我仍然可以拥有自定义消息 (MSG) 吗?或者甚至使用联合搜索多个表?


因此在 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
    }
}

规格

下一个是规格(正如您已经提到的)。我不会在这里对规格进行深入解释,因为它已经在您共享的教程链接中进行了解释。但是,如果您不想自己编写 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何实现具有LinkedHashMap类似功能的ConcurrentHashMap?

    我用过LinkedHashMap with accessOrdertrue 并同时允许最多 500 个条目作为数据的 LRU 缓存 但由于可扩展性问题 我想转向一些线程安全的替代方案 ConcurrentHashMap在这方面似乎不错 但缺
  • jpa2 CriteriaBuilder order by “ORDER BY 表达式必须出现在选择列表中”

    我正在写一个查询标准生成器 但无法添加order by子句 因为它随消息一起抛出错误ORDER BY 表达式必须出现在选择列表中这是我的实体 public class A Integer aId ManyToOne JoinColumn n
  • 初始堆大小无效。无法创建Java虚拟机

    我遇到了下一个问题 我尝试通过startup bat手动启动Tomcat 但似乎没有显示任何结果 然后我尝试运行shutdown bat 控制台显示如下 D apache tomcat 7 0 35 bin gt startup bat U
  • 全静态方法和应用单例模式有什么区别?

    我正在创建一个数据库来存储有关我的网站用户的信息 我正在使用 stuts2 因此使用 Java EE 技术 对于数据库 我将创建一个 DBManager 我应该在这里应用单例模式还是将其所有方法设为静态 我将使用这个 DBManager 进
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • EMF Eclipse:带有自定义字段(属性)的枚举

    好吧 在 Java 中这是可能的 import org eclipse emf common util Enumerator public enum MyEnum implements Enumerator LITERAL1 0 Name
  • 按文件名过滤 eclipse 中的警告

    我们使用 Eclipse 进行 Java 开发 并使用 Maven 将 JSP 编译成 servlet 以便在嵌入式 Jetty 实例中使用 这意味着要从 Eclipse 运行该项目 我必须包含 target jsp source 作为源文
  • spring mvc 跟踪引用页面

    在基于注释的弹簧控制器中 如果用户正在url com first page并点击一个链接或提交一份表格指出url com second page 如何制作second page知道url of first page所以这样second pa
  • 为什么我要使用责任链而不是 switch 语句

    考虑一下您已经获得了多次验证 仅当要检查的对象属于某种类型时 这些验证才应生效 为什么我要使用责任链而不是 switch 语句 责任链示例 public class Executor Inject private ValidatorFact
  • vm 参数中的 -D 是什么,它表示为什么我们必须在 vm 参数中始终指定 -D

    vm 参数中的 D 是什么 它表示为什么我们必须在 vm 参数中始终指定 D 有什么标准吗 如果是 那是什么以及指定的位置 D 设置当前运行的 java 程序可以访问的属性值 它允许程序员设置程序运行所需的值 但程序不知道这些值是什么 因此
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • 获取包中声明的所有 Java 类的名称

    我正在编写一个功能 它将有助于将类放入我的程序的某个包中 另外 我只想要子类某个类的类 我需要这些类才能调用它们的静态方法 有没有一种自动的方法来做到这一点 如果是的话 速度慢吗 如果我不清楚 我想要的是这样的 ArrayList
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • while 之后无法访问的语句[重复]

    这个问题在这里已经有答案了 我只是修改代码 在以下代码中出现错误 int x 1 System out println x x while true x System out println x x 错误在最后一行 我可以知道错误 错误 无
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • 如何列出Resources文件夹中的所有文件(java/scala)

    我正在编写一个函数 需要访问资源中的文件夹 并循环遍历所有文件名 如果这些文件符合条件 则加载这些文件 new File getClass getResource images sprites getPath listFiles 返回空指针
  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv
  • Retrofit 2.0:预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $ [重复] 处为 STRING

    这个问题在这里已经有答案了 我在邮递员上传递了更新用户请求并获得了成功的响应 参见图片 现在当我尝试使用 Retrofit 2 在我的应用程序中执行相同操作时 出现错误 com google gson JsonSyntaxException

随机推荐