错误:运算符不存在:字符变化= bytea

raj*_*har 5 postgresql hibernate

我在postgres中有一个表格,结构如下

CREATE TABLE rpaul."HK_LOGIN_DETAILS"
(
  "HK_LOGIN_DETAILS_ID" bigint NOT NULL,
  "HK_LOGIN_DETAILS_USERNAME" character varying(10) NOT NULL,
  "HK_LOGIN_DETAILS_PASSWORD" character varying(50) NOT NULL,
  CONSTRAINT "HK_LOGIN_DETAILS_PK" PRIMARY KEY ("HK_LOGIN_DETAILS_ID" ),
  CONSTRAINT "HK_LOGIN_DETAILS_UK" UNIQUE ("HK_LOGIN_DETAILS_USERNAME" )
)
Run Code Online (Sandbox Code Playgroud)

此表的hibernate映射如下所述

<hibernate-mapping package="net.rpaul.projects.homekeeping.domain.login">
    <class name="LoginDetails" table="`HK_LOGIN_DETAILS`">
        <id name="id" column="`HK_LOGIN_DETAILS_ID`" type="long">
            <generator class="assigned" />
        </id>
        <property name="userName" type="string" column="`HK_LOGIN_DETAILS_USERNAME`" not-null="true" />
        <property name="password" type="string" column="`HK_LOGIN_DETAILS_PASSWORD`" not-null="true" />
    </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

在LoginDetails.java中,我将id字段声明为long,userName和password字段声明为String.还是当我尝试执行以下操作时

List list =  getHibernateTemplate().find("from LoginDetails ld where ld.userName = ?", userName);
Run Code Online (Sandbox Code Playgroud)

我明白了

错误:运算符不存在:字符变化= bytea

我没有得到出错的地方.任何帮助,将不胜感激.

cha*_*los 12

我认为您应该检查您的变量"userName"是否为空.在这样的情况下我经历过这个消息.

  • 我曾经遇到过这个问题,我解决了在查询之前将变量设置为空字符串('')的问题,以防它为空。 (3认同)

Har*_*h C 9

这个问题很老了,但如果有人需要的话,仍然分享我在 Spring Boot 中使用的解决方案。

您可以使用以下 WHERE 条件来处理 NULL 值或使参数在 Postgres 查询中可选。

SELECT * FROM table 
WHERE 
          (?1 is null OR column1 = cast(?1 AS text)) 
          AND 
          (?2 is null OR column2 = cast(?2 AS text))
Run Code Online (Sandbox Code Playgroud)

如果column1 和column2 作为NULL 传递,则整个WHERE 条件将为TRUE。如果column1和column2不为NULL,则查询中将考虑column1和column2。

?1 为空或列 1 = ?1 :将检查传递的值是否为 null,然后整个 where 条件将为 true(如果为 null,则不会检查第二个条件 [column1 = null] - PG 优化)

cast(?1 AS text) :如果由于某种原因值作为 bytea 传递,则可能很有用。如果传递的值是真正的 null,如果不进行强制转换,它仍然会给出“charactervaryingbytea”错误。

  • 此方法仅适用于nativeQuery = false (3认同)

sto*_*ito 5

似乎 Hibernate 出于某种原因将类型参数作为 bytea(或者更确切地说,可能是 java.sql.Types.BLOB)发送,而不是将其留给服务器来推断或将其设置为文本 (java.sql.Types.细绳)。这是与参数上的解决方案JPA lower() 函数类似的问题