gpt4 book ai didi

mysql - 当在MySQL Workbench中工作时,Jpa Criteria等于表的String属性的谓词(带有newLine字符'\n')不起作用

转载 作者:行者123 更新时间:2023-11-29 09:51:48 24 4
gpt4 key购买 nike

如标题所示,在特定情况下尝试将JPA CriteriaSpring Boot一起使用时遇到问题。

通常,一切正常,但是尝试使用嵌入了StringnewLine character)的\n属性搜索存储的数据似乎无效。

我能够Get数据,编辑它们,通过前端保存它们,用多行创建新内容等。但是尝试在例如'hello\nworld'等于列的情况下搜索它们,即使运行MySQL Workbench中的此查询可返回所需数据:

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

为了明确起见,我执行搜索的方法是等待Get请求一个名为search的参数,该参数具有用户过滤的所有属性。我将其与Regex匹配(在Java 8.0 new Regex \\\\R内也可与multilines匹配(并且有效)),然后将Service layer赋予我匹配的Search 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中的column description_en中存储的数据是a\ns\ndd),所以我如您所见,我正在搜索此内容,而不是我之前hello\nworld所说的示例:


2019-02-12 16:01:01.929 DEBUG 18368 --- [nio-8080-exec-2] org.hibernate.SQL : select ctthhlasti0_.id as col_0_0_, ctthhlasti0_.act_code as col_1_0_, ctthhlasti0_.description_en as col_2_0_, ctthhlasti0_.remarks as col_3_0_ from ct_thhlastika_press_threats ctthhlasti0_ where 1=1 and ctthhlasti0_.description_en=? order by ctthhlasti0_.id asc limit ?
2019-02-12 16:01:01.933 TRACE 18368 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [a\ns\ndd]
2019-02-12 16:01:01.944 DEBUG 18368 --- [nio-8080-exec-2] org.hibernate.SQL : select count(ctthhlasti0_.id) as col_0_0_ from ct_thhlastika_press_threats ctthhlasti0_ where 1=1 and ctthhlasti0_.description_en=?
2019-02-12 16:01:01.944 TRACE 18368 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [a\ns\ndd]
2019-02-12 16:01:01.946 TRACE 18368 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([col_0_0_] : [BIGINT]) - [0]



对于任何有兴趣进一步研究代码的人,您都可以找到它 Github repo。该项目适合我的大学论文。我对添加到ctThhlastikaPressThreats控制器和存储库的正则表达式(均为它们)进行了评论。需要生成数据库(用于测试的标准数据库和辅助数据库)(可以通过更改application.properties中的auto-dll来生成)。



更新资料

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

我的实现的进一步说明

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

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

如您所见,我正在使用名为 search的路径变量(具有用户请求的所有属性过滤功能),以及 sizepagesort的另外3个。

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

这三个字符在两个地方都是 Regexed。在 ControllerSearchRepository中(例如,由于我们专门从此开始-> CtThhlastasikaPressThreats

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

重现步骤 :

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

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

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

在方法 search(位于第61行之后)的CtThhlastikaPressThreatsSearchRepository中,将其放在上方:

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,所以我想它仍然不是理想的解决方案。认为在db中将它存储为lineSeparators的 \n

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

最后的想法

我相信,即使这样

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

在MySQL Workbench中工作,试图同时包含 newLine charlineSeparators时,两者之间的某些内容可能会破坏请求。



如果对为什么它无法按预期运行有任何想法,请分享以进行尝试。

感谢您的时间

最佳答案

我知道了。可能不是您想要的答案,但是,如果用系统行分隔符替换传入的“ \ n”,它将得到您想要的答案。

 search = search.replace("\\n", System.getProperty("line.separator"));
try {
return ctThhlastikaPressThreatsService.searchCtThhlastikaPressThreats(producedSearchCriterias(search), size, page, sort);


如果您查看参数值记录,您将看到参数现在是

extracted value ([col_2_0_] : [VARCHAR]) - [hello
world]



代替

extracted value ([col_2_0_] : [VARCHAR]) - [hello\nworld]


就像我怀疑在搜索管道中的某个地方,它在转义“ \ n”。我并不是建议您按照我在控制器上的建议去做,我只是想向您展示这是要在某个地方(要在某处发生)才能起作用的原因。

关于mysql - 当在MySQL Workbench中工作时,Jpa Criteria等于表的String属性的谓词(带有newLine字符'\n')不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54652202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com