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

创建可能包含参数或不包含参数的JPA查询的最佳方法

相弘方
2023-03-14

有一种方法可以创建这样的JPA查询

        String queryString = "SELECT i FROM Item i";

        if (null != search) {
            queryString += " WHERE i.name LIKE :pattern";
        }

        TypedQuery<Item> query = entityManager.createQuery(queryString, Item.class);

        if (null != search) {
            query.setParameter("pattern", "%" + search + "%");
        }

如果查询需要可选的搜索字段(如果为null!=search)最常见的避免重复的方法是什么?对于单个参数,可以有两个命名查询,或者Criteria API可能允许避免这种情况(因为没有查询字符串),但还有其他方法吗?

共有1个答案

芮明知
2023-03-14

如果不必以编写查询字符串的方式编写查询,那么可以使用JPA Criteria API。你可以看到我称之为“ExampleDao”的类,我在这里使用它进行研究和示例。

然后,您将向其添加一个可选的Anywhere子句,请参见下面的示例:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Item> criteria = cb.createQuery(Item.class);
Root<Item> root = criteria.from(Item.class);
criteria.select(root);

if (null != search) {
    String pattern = "%pattern here%";
    criteria.where(cb.like(root.get("name"), pattern));
}
 类似资料:
  • 我在Firestore中收集了一组文档,其中有一个字段是字符串数组,这些是添加到数据中的标记。 用户可以通过在前端选择和取消选择这些标签来过滤数据,所以我正在做一个数组来查询Firestore。 然后,我在最佳匹配上对结果进行评分,因此匹配更多标签的文档被排序到顶部,并显示到页面顶部供用户使用。 我现在正试图用带有文档快照的startAfter作为光标和限制,对这些数据进行分页。但我需要确保,当限

  • 我正在尝试将一个参数传递给包含在主jsp中的jsp文件。从我在网上看到的使用c:set 虽然当我尝试使用包含的jsp页面中的变量时,似乎只有一个参数通过(第二个没有使用c: set) 没有崩溃,但我可以看到myArg01为空

  • 问题内容: 我有这个下面的代码。 编辑: 这是被称为回调函数的函数: 现在,如果我想将变量作为参数传递给回调函数,是否有办法做到这一点而不必在调用中将其添加为另一个参数?我试图让该函数对其他用法开放,所以我不想传递任何额外的参数;但是如果它可以以某种方式包含在回调中,那就太好了。 问题答案: 将回调更改为匿名函数: 这使您可以将参数传递给内部函数。 编辑:允许ajax响应:

  • 问题内容: 考虑以下示例: 失败并出现以下错误 为什么呢 生成的方法没有重叠。事实上,这实际上意味着 那里没有重叠。那为什么会失败呢? 如果您想知道我在做什么,并且有更好的解决方案:我有一堆Event和Listener接口,它们几乎与上述类完全一样。我想创建一个适配器和一个适配器接口,为此,我需要使用特定事件扩展所有Listener接口。这可能吗?有一个更好的方法吗? 问题答案: 不,你不能。这是

  • 问题内容: 我正在编写Android应用程序,此处的最佳方法通常可能与Java相同或不同。 我只是希望能够设置一个调试标志,该标志仅在设置为true时才执行代码的某些部分–等同于C ++设置预处理器#define DEBUG并使用#ifdef DEBUG。 在Java中是否有公认的或最佳的方法来完成此任务? 现在,我只是要在Application对象中设置一个变量,但是我不认为这是最好的方法。 问

  • 我有一个格式如下的url: http://www.example.com/path?param1=value1&param2=value2 我需要一个正则表达式以任何顺序匹配路径和params1和params2,但如果param3存在,那么我需要它失败,这样: 因此,我尝试使用lookarounds来匹配参数,但它失败了: 有什么想法吗? 警局。奇怪的是,我试图匹配AndroidManifest.