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

Spring数据存储库将null作为字节发送到PostgreSQL数据库

戚建华
2023-03-14

从MySQL切换到PostgreSQL后,我发现我的SQL查询(spring数据存储库界面中的@query)不再有效。这个问题是由null值作为bytea发送引起的,我得到了以下异常:

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: bigint = bytea
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

带有@Query的存储库:

public interface WineRepository extends PagingAndSortingRepository<Wine, Long> {
    @Query(value = "SELECT * FROM WINE w WHERE (?1 IS NULL OR w.id = ?1)", nativeQuery = true)
    Wine simpleTest(Long id);
}

简单测试:

LOGGER.warn("test1: {}", wineRepository.simpleTest(1L));    //ok
LOGGER.warn("test2: {}", wineRepository.simpleTest(null));  //PSQLException

在实际情况中,我有多个可以为null的参数,我不希望在java代码中检查它们,而是将它们发送到sql查询。我在这里检查了stackoverflow的问题,但没有找到一个好答案,尤其是spring data repository@query annotation。

使用PostgreSQL处理空值的正确方法是什么?或者您有任何提示如何修复我的方法?谢谢!

更新:问题似乎与nativeQuery=true有关,当值为false时,空值按预期工作。所以问题是,即使启用了nativeQuery,它是否也能正常工作。

共有3个答案

莫宝
2023-03-14

我在一个@Query中遇到了类似的问题,Postgres将Long解释为bytea。对我来说,解决办法是解开@Param。。。通过传递长值,Postgres将该值正确地解释为bigint

常翰
2023-03-14

您正在尝试检查Javanull是否等于Postgresnull,我认为这是不必要的。您可以按照以下方式重写,并完全避免向simpleTest函数发送null。

@Query(value = "SELECT * FROM WINE w WHERE (w.id IS NULL OR w.id = ?1)", nativeQuery = true)
Wine simpleTest(Long id);
丘友樵
2023-03-14

试试这个。

SELECT *
FROM WINE w
WHERE ?1 IS NULL OR w.id = CAST(CAST(?1 AS TEXT) AS BIGINT)

它满足类型检查器的要求,并且应该具有与原始查询相同的属性<如果代码>强制转换发生在常量值而不是数据库行中的值上,则不会对性能造成太大影响。

 类似资料:
  • 正如标题所说,当我将spring数据rest存储库添加到现有的spring数据rest webmvc项目中时,我开始在项目运行中出错。 我试图使用@ConvertBy(MyConverter.class)在实体中遵循此链接进行嵌入ID转换。然而,仅仅添加jar就会导致以下错误和大量o. s. c. i. s. PathMatchingResourcePatterResolver日志。

  • 问题内容: 我有这个小点击计数器。我想将每次单击都包含在mysql表中。有人可以帮忙吗? 万一有人想看看我做了什么: 这是phpfile.php,出于测试目的,将数据写入txt文件 问题答案: 您的问题中定义的JavaScript不能直接与MySql一起使用。这是因为它不在同一台计算机上运行。 JavaScript在客户端(在浏览器中)运行,并且数据库通常在服务器端存在。您可能需要使用中间服务器端

  • 告诉我如何在Azure存储帐户中存储PostgreSQL数据库数据。PostgreSQL部署到Azure容器实例。当我重新启动Azure容器实例时,所有数据都会消失。Dockerfile 来自Timescale/Timescaledb:Latest-PG12 az容器创建--resource-group test-env--name test-env--image test-env.azureca

  • 问题内容: 有人可以告诉我,在以下情况下如何进行? 接收文件(MS文件,ODS,PDF) 通过Apache Tika提取公元核心元数据+通过jackrabbit-content-extractors提取内容 使用Jackrabbit将文档(内容)及其元数据存储到存储库中 ? 检索文档+元数据 我对第3点和第4点感兴趣… 详细信息:该应用程序正在以交互方式处理文档(一些分析-语言检测,单词计数等。+

  • 我正在使用Hibernate。我有一把刀: 在哪里 并用@Entity注释。 它包含它所表示的表的所有列名。 然后,我的服务类自动连接了上述dao对象。我可以看到DmRequestDomain的值正确地打印在日志文件中。 但是当我通过这条道调用add时,我在我的服务器日志中看到所有的空值都被发送了。 可能的原因是什么。 我在服务器日志中看到的查询是

  • 问题内容: 在数据库中存储图像的常用方法是在存储数据之前将图像转换为数据。此过程将使大小增加33%。或者,可以将图像直接存储为;例如: 然后用 使用后一种方法,我们可以节省1/3的存储空间。为什么像在MySQL数据库中那样存储图像更常见? 更新: 关于将图像存储在数据库中的优点和缺点的争论很多,大多数人认为这不是一种实用的方法。无论如何,在这里我假设我们将图像存储在数据库中,并讨论了这样做的最佳方