问题标签 [jpa-criteria]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
711 浏览

java - 通过 Hibernate Annotation 和 JPA 标准在一个公共列的基础上加入两个表 查询未按预期工作

我有两张桌子device_datadevice_connection. 我想根据 column 加入这两个表customerId。两个表都有customerId列。

设备数据

设备连接

我写了一个查询来从这两个表的连接中获取数据。

我将属性 SHOW_SQL 设置为 TRUE。所以,这里是hibernate生成的查询。

当我在 My Sql 工作台上运行此查询时,它将按预期工作并给我结果。但是hibernate不断给我异常我不知道为什么?

例外

java.lang.ClassCastException:com.sbi.model.DeviceConnection 不能转换为 java.math.BigInteger

0 投票
1 回答
650 浏览

mysql - Jpa Criteria equals Predicate for a table's String property (with newLine character '\n') 在 MySQL Workbench 中不起作用

正如标题所示,我在尝试将JPA CriteriawithSpring Boot用于特定情况时遇到问题。

通常一切正常,但尝试使用嵌入 ( ) 的String属性搜索存储的数据似乎不起作用。newLine character\n

我能够对Get数据进行编辑,通过前端保存它们,使用多行创建新数据等。但是,'hello\nworld'即使在 MySQL Workbench 中运行此查询有效,当列等于它时尝试搜索它们也不会起作用返回所需的数据:

select * from kerkinidb.ct_thhlastika_press_threats where description_en = 'hello\nworld';

澄清一下,我进行搜索的方式是在Get请求中等待一个名为的参数,该参数search具有用户过滤的所有属性。我将它与 a 匹配Regex(其中也有Java 8.0 new Regex \\\\Rfor 匹配multilines(并且它有效))然后我给出我匹配的Service layertheSearch Criteria然后传递给Jpa Criteria Repository解析它们和generating the Predicates(再次匹配Regex and \\\\R以创建最终Predicate with OR and ANDs的过滤)然后triggering the query,然后another query called count执行Pagination,最后mapping到自定义对象并返回它。

我调试了每一步,最终的谓词确实生成了我想要的查询,但是数据库没有返回预期的数据。所以我真的很困惑,因为正如我所说的查询确实在MySQL Workbench.

MySQL logs这是触发请求时生成的日志记录(我打开了 Spring Boot 日志记录)的一个示例(在这种情况下,我在我Table ct_thhlastika_press_threats的 in 中存储的数据column description_ena\ns\ndd所以我正在搜索这个,如您所见而不是我之前说的例子hello\nworld

对于任何有兴趣深入了解代码的人,您可以在Github repo中找到它。这个项目是为了我的大学论文。我对添加到 ctThhlastikaPressThreats 控制器和存储库的正则表达式(两者)发表了评论。需要生成db(标准以及用于测试的辅助)(可以通过更改application.properties中的auto-dll来生成)。




更新

我尝试使用System.lineSeparator()(按照@Hermann Steidel下面的答案中的建议)替换文本 newLine \n。但是即使在日志中我们现在可以清楚地看到 equals Predicate 的值具有行分隔符,它仍然不会从数据库返回数据。

我的实施的进一步解释

动态搜索的正确 Get 请求如下所示:

http://localhost:8080/v1/ctThhlastikaPressThreats/search?search=descriptionEn~hello\nworld;@&size=10&page=0&sort=Asc

如您所见,我正在使用一个名为的路径变量search(它具有用户请求的所有属性过滤)以及另外 3 个用于size,pagesort.

对于search变量,我使用 3 个不同的字符来实现最终查询的 OR 和 AND 谓词。这些~是要知道属性在它需要使用相等谓词之前,;它是能够为用户请求的每个属性具有多个值,最后是@触发该属性过滤的结束。

这三个字符Regexed在两个地方。在Controller和中SearchRepository(例如,因为我们专门从这个开始 -> 的CtThhlastasikaPressThreats

最后在 SearchRepository 中,您可以看到我正在触发 2 个查询,一个是从数据库中获取过滤后的数据,另一个是获取数据的计数以用于分页目的,同时最终映射到自定义 DTO。

重现步骤 :

生成数据库后,更改 CtThhlastikaPressThreats 的 2 个正则表达式。为了Controller存在(\w+?)(~|<|>)([(!-/.\\\\R 0-9\p{L});]+)?@和为了SearchRepository存在([(!-/.\\\\R 0-9\p{L})]+)

然后,您可以使用我上面的请求示例,在为特定表和列保存的特定表和列descriptionEn中保存hello\nworld例如值或您输入的任何值(也将其更改为请求)。

我试过但不是解决方案的最后一件事:

将 CtThhlastikaPressThreatsSearchRepository 放入方法中search(位于第 61 行之后):

predicate = builder.equal(root.get(param.getKey()), match.toString());

使其为:

match = match.toString().replace("\\n", System.lineSeparator()); predicate = builder.equal(root.get(param.getKey()), match.toString());

这基本上会改变价值,hellow\nworld所以hello\r\nworld我想它仍然不是理想的解决方案。认为在数据库中它被存储为\nlineSeparators。

现在在日志中您可以看到,当您再次触发 Get Request 时,VARCHAR 值descriptionEn现在确实带有行分隔符,而不是\n(仍然应该被 MySQL 识别)文本。

最后的想法

我相信即使这样

select * from kerkinidb.ct_thhlastika_press_threats where description_en = 'hello\nworld';

在 MySQL Workbench 中工作,在尝试包含newLine charor时,介于两者之间的东西可能会破坏请求lineSeparators




如果有任何想法为什么它不能按预期工作,请分享以尝试一下。

感谢您的时间

0 投票
2 回答
171 浏览

java - 如何过滤 ArrayList 中的空值

我有一个非常大的代码。我遇到了一个问题,在代码的最开始,null 被插入到 arraylist 中,custlist即 custlist 看起来像 [null]。在多行代码之后,我在构建 Predicate 的地方进行了代码更改,custlist如下所示:

所以第一个检查通过了,(custlist != null && !custlist.isEmpty()) 并且谓词被建立了。这在执行最终查询时给了我错误。我的问题是 - 无论如何我可以确保仅在 custlist 没有空值时创建谓词。我的问题是 - 就像 Collectionutils.isEmpty() 同时检查空值和空值一样,如果有人可以帮助我使用一些也可以检查null inside arraylist的 API。

0 投票
0 回答
81 浏览

sql - 如何在 JPA 标准中实现子查询,同时加入表视图以删除重复项

我正在处理一个聚合查询,其中我们有两个名为 Task 和 Member 的表视图。

对于成员视图,我们可以有重复项。即:成员视图的id字段不是唯一的。

因此,当我们进行分组以在成员视图中查找任务名称和属性的组合时,它不会按预期工作。在这种情况下,我在 SQL 中制定了一个查询来删除下面添加的重复项。

现在我想知道如何将上面使用的 JOIN 转换为 JPA 标准 API。

这个查询是否可以通过 JPA 标准来完成。

下面给出了相同的 JPA 实体。

任务实体:-

会员实体:-

如果不是,我想知道一种替代方法,它可以在使用 GROUP BY 子句时忽略重复项,该子句也可以与 JPA 一起使用。

我真的很感激任何帮助。

0 投票
0 回答
35 浏览

java - JPA - 重用来自不同类的规范

假设我以这种方式定义了 2 个类

并且还有 A 和 B 的谓词,像这样

既然两个谓词都用于不同的类,有没有办法在同一个查询中同时使用这两个谓词?例如,获取具有匹配名称和 bla 的元素

0 投票
1 回答
76 浏览

jpa - 当外键列为空时,jpa 标准中的多选会引发非法参数异常

通过joinAddress.get(Address_.ADDRESS_ID)在多选中使用上面的语句,我试图在位置表中选择表地址的外键。当我在做左连接时,对于某些行它是空的。因此,当我尝试选择它时,它会显示非法参数异常。

0 投票
1 回答
300 浏览

java - 具有单向关系的 Criteria API

我有三个实体。我需要构建 Criteria API,如果唯一用户超过 userCount 变量,我可以在其中选择项目。

我想选择所有项目,其中唯一用户> = userCount。我在 jpql 中构造查询

我写了标准:

这工作正常,但此标准需要客户端类中的会话。

这对我很不利。我需要在客户端类中构建没有会话的 Criteria API。我试过这个:

这行不通。

如果没有客户端类中的会话,我怎么能做到这一点?

0 投票
1 回答
440 浏览

hibernate - 聚合子查询结果上的 JPA 聚合

我有以下 JPA 实体(省略了 getter、setter 和非相关字段):

我的目标是使用 JPQL 或标准 API 实现查询,它将返回每天的平均交易量和每天的最大交易量。

提供所需结果的本机 SQL 查询(MySQL 数据库)如下所示:

不幸的是,不鼓励使用本机 SQL 查询,并且 JPQL 不允许在 where 子句中使用子查询。

先感谢您。

添加:

我从以下 Spring Data 查询开始:

但它显然没有用:

我可以想象,使用排序和限制输出可以管理搜索最大值,但这对平均值没有帮助。

0 投票
1 回答
218 浏览

java - 解释 JPA Criteria API From 类及其类型参数的含义

javax.persistence.criteria.From的目的是什么,它的类型参数ZX代表什么?

文档根本不清楚。

在看到javax.persistence.criteria.Root类型具有以下定义后,我变得更加困惑:

public interface Root<X> extends From<X,X>

0 投票
1 回答
373 浏览

hibernate - 使用 JPA 标准的代码的替代方式

随着 Hibernate 5.2.2 中 Criteria 类中的 createCriteria() 的弃用,它的许多相关函数都不能再使用了。我找到了 criteria.createAlias(String, String) 的替代用途,并从以下链接添加了 Restriction Deprecated createCriteria method in Hibernate 5 但我找不到如何在 JPA 标准中替换 Criteria 中可用的以下函数:

请为我提供另一种使用 JPA 标准 API 编写相同代码的方法。