问题标签 [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.
java - 通过 Hibernate Annotation 和 JPA 标准在一个公共列的基础上加入两个表 查询未按预期工作
我有两张桌子device_data
和device_connection
. 我想根据 column 加入这两个表customerId
。两个表都有customerId
列。
设备数据
设备连接
我写了一个查询来从这两个表的连接中获取数据。
我将属性 SHOW_SQL 设置为 TRUE。所以,这里是hibernate生成的查询。
当我在 My Sql 工作台上运行此查询时,它将按预期工作并给我结果。但是hibernate不断给我异常我不知道为什么?
例外
java.lang.ClassCastException:com.sbi.model.DeviceConnection 不能转换为 java.math.BigInteger
mysql - Jpa Criteria equals Predicate for a table's String property (with newLine character '\n') 在 MySQL Workbench 中不起作用
正如标题所示,我在尝试将JPA Criteria
withSpring 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 \\\\R
for 匹配multilines
(并且它有效))然后我给出我匹配的Service layer
theSearch 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_en
是a\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
,page
和sort
.
对于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
我想它仍然不是理想的解决方案。认为在数据库中它被存储为\n
lineSeparators。
现在在日志中您可以看到,当您再次触发 Get Request 时,VARCHAR 值descriptionEn
现在确实带有行分隔符,而不是\n
(仍然应该被 MySQL 识别)文本。
最后的想法
我相信即使这样
select * from kerkinidb.ct_thhlastika_press_threats where description_en = 'hello\nworld';
在 MySQL Workbench 中工作,在尝试包含newLine char
or时,介于两者之间的东西可能会破坏请求lineSeparators
。
如果有任何想法为什么它不能按预期工作,请分享以尝试一下。
感谢您的时间
java - 如何过滤 ArrayList 中的空值
我有一个非常大的代码。我遇到了一个问题,在代码的最开始,null 被插入到 arraylist 中,custlist
即 custlist 看起来像 [null]。在多行代码之后,我在构建 Predicate 的地方进行了代码更改,custlist
如下所示:
所以第一个检查通过了,(custlist != null && !custlist.isEmpty())
并且谓词被建立了。这在执行最终查询时给了我错误。我的问题是 - 无论如何我可以确保仅在 custlist 没有空值时创建谓词。我的问题是 - 就像 Collectionutils.isEmpty() 同时检查空值和空值一样,如果有人可以帮助我使用一些也可以检查null inside arraylist
的 API。
sql - 如何在 JPA 标准中实现子查询,同时加入表视图以删除重复项
我正在处理一个聚合查询,其中我们有两个名为 Task 和 Member 的表视图。
对于成员视图,我们可以有重复项。即:成员视图的id字段不是唯一的。
因此,当我们进行分组以在成员视图中查找任务名称和属性的组合时,它不会按预期工作。在这种情况下,我在 SQL 中制定了一个查询来删除下面添加的重复项。
现在我想知道如何将上面使用的 JOIN 转换为 JPA 标准 API。
这个查询是否可以通过 JPA 标准来完成。
下面给出了相同的 JPA 实体。
任务实体:-
会员实体:-
如果不是,我想知道一种替代方法,它可以在使用 GROUP BY 子句时忽略重复项,该子句也可以与 JPA 一起使用。
我真的很感激任何帮助。
java - JPA - 重用来自不同类的规范
假设我以这种方式定义了 2 个类
并且还有 A 和 B 的谓词,像这样
和
既然两个谓词都用于不同的类,有没有办法在同一个查询中同时使用这两个谓词?例如,获取具有匹配名称和 bla 的元素
jpa - 当外键列为空时,jpa 标准中的多选会引发非法参数异常
通过joinAddress.get(Address_.ADDRESS_ID)
在多选中使用上面的语句,我试图在位置表中选择表地址的外键。当我在做左连接时,对于某些行它是空的。因此,当我尝试选择它时,它会显示非法参数异常。
java - 具有单向关系的 Criteria API
我有三个实体。我需要构建 Criteria API,如果唯一用户超过 userCount 变量,我可以在其中选择项目。
我想选择所有项目,其中唯一用户> = userCount。我在 jpql 中构造查询
我写了标准:
这工作正常,但此标准需要客户端类中的会话。
这对我很不利。我需要在客户端类中构建没有会话的 Criteria API。我试过这个:
这行不通。
如果没有客户端类中的会话,我怎么能做到这一点?
hibernate - 聚合子查询结果上的 JPA 聚合
我有以下 JPA 实体(省略了 getter、setter 和非相关字段):
我的目标是使用 JPQL 或标准 API 实现查询,它将返回每天的平均交易量和每天的最大交易量。
提供所需结果的本机 SQL 查询(MySQL 数据库)如下所示:
不幸的是,不鼓励使用本机 SQL 查询,并且 JPQL 不允许在 where 子句中使用子查询。
先感谢您。
添加:
我从以下 Spring Data 查询开始:
但它显然没有用:
我可以想象,使用排序和限制输出可以管理搜索最大值,但这对平均值没有帮助。
java - 解释 JPA Criteria API From 类及其类型参数的含义
类javax.persistence.criteria.From的目的是什么,它的类型参数Z
和X
代表什么?
文档根本不清楚。
在看到javax.persistence.criteria.Root类型具有以下定义后,我变得更加困惑:
public interface Root<X> extends From<X,X>
hibernate - 使用 JPA 标准的代码的替代方式
随着 Hibernate 5.2.2 中 Criteria 类中的 createCriteria() 的弃用,它的许多相关函数都不能再使用了。我找到了 criteria.createAlias(String, String) 的替代用途,并从以下链接添加了 Restriction Deprecated createCriteria method in Hibernate 5 但我找不到如何在 JPA 标准中替换 Criteria 中可用的以下函数:
请为我提供另一种使用 JPA 标准 API 编写相同代码的方法。