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

绑定本机查询错误。EclipseLink(JPA2.1)

潘自强
2023-03-14

将变量绑定到本机查询时出错。EclipseLink(JPA2.1)

 String sql = "ALTER ROLE ?1 WITH ENCRYPTED PASSWORD 'xxx'"; //(not working)
 //String sql = "ALTER ROLE ? WITH ENCRYPTED PASSWORD 'xxx'"; (not working)

 Query query = em.createNativeQuery(sql);

 String text = txtUsername.getText();


 query.setParameter(1, text);

 em.getTransaction().begin();


 int executeUpdate = query.executeUpdate();
 em.getTransaction().commit();

内部异常:org.PostgreSQL.util.psqlException:错误:“$1”位置或附近的语法错误:12错误代码:0线程“awt-eventqueue-0”javax.Persistence.persistenceException:Exception[EclipseLink-4002](Eclipse Persistence Services-2.5.2.v20140319-9ad6abd):org.Eclipse.Persistence.exceptions.databaseException调用:ALTER ROLE?使用加密密码'xxx'bind=>[1 parameter bound]查询:DataModifyQuery(sql=“ALTER ROLE?WITH ENCRYPTED PASSWORD'xxx'”)内部异常:org.PostgreSQL.util.psqlexception:错误:语法错误位于或靠近“$1”位置:12错误代码:0调用:ALTER ROLE?使用加密密码'XXX'

共有1个答案

养研
2023-03-14

在此查询中不能参数化用户名和密码。另一种方法是编写一个存储的函数并调用该函数。我在网上找到的一个可以修改的商店功能是:

CREATE OR REPLACE FUNCTION save_user(
in_username text,
in_password TEXT) returns bool
SET datestyle = 'ISO, YMD' -- needed due to legacy code regarding datestyles
AS $$
DECLARE

    stmt text;
    t_is_role bool;
BEGIN
    -- WARNING TO PROGRAMMERS:  This function runs as the definer and runs
    -- utility statements via EXECUTE.
    -- PLEASE BE VERY CAREFUL ABOUT SQL-INJECTION INSIDE THIS FUNCTION.

   PERFORM rolname FROM pg_roles WHERE rolname = in_username;
   t_is_role := found;

   IF t_is_role is true and t_is_user is false and in_pls_import is false THEN
      RAISE EXCEPTION 'Duplicate user';
    END IF;

    if t_is_role and in_password is not null then
            execute 'ALTER USER ' || quote_ident( in_username ) ||
                 ' WITH ENCRYPTED PASSWORD ' || quote_literal (in_password)
                 || $e$ valid until $e$ ||
                  quote_literal(now() + '1 day'::interval);
    elsif  t_is_role is false THEN
        -- create an actual user
            execute 'CREATE USER ' || quote_ident( in_username ) ||
                 ' WITH ENCRYPTED PASSWORD ' || quote_literal (in_password)
                 || $e$ valid until $e$ || quote_literal(now() + '1 day'::interval);
   END IF;

   return true;

END;
$$ language 'plpgsql' SECURITY DEFINER;
 类似资料:
  • 存储库接口: 当我运行调用本机查询的endpoint时,我得到异常: 无法将值“{0,198}”从类型[java.lang.Object[]]转换为类型[com.representation.representation];嵌套异常为org.springframework.core.convert.converterNotFoundException:未找到能够从类型[java.math.BigD

  • 有两个实体Person和Address。人与地址之间存在1:M关系。(假定某人有临时和永久地址)。 Person类的关键属性是: < li>personId(pk) < li >性别 地址类的主要属性是: 地址id(pk) 人(fk) 性别 以下是Person和Address类的描述符代码片段: 以下是用于生成动态查询的代码片段: 运行此程序时,根据日志生成的查询: 如何编写表达式在第一个join

  • 我想在我的repo中写一个本机查询“Select*in from table”。表名与实体名不同。 运行查询时, 1如果我把实体名称返回表未找到。 2如果我将表名放在查询中,则查询的验证失败。 问题是 如果我使用"Select*from TariffPacks r2..., nativeQuery=true",我得到错误TariffPacks不存在。如果我使用"Select*from RECHAR

  • 当使用jpa本机查询 事务传播是我们正在使用的正确jpa的唯一特性吗? 在我的意见中,我就像使用普通的旧jdbc pluc jpa事务传播 我正在阅读PRO JPA一书,根据我的理解 当我们使用JPA本机查询获取一组标量值时(与我们使用jdbc的方式很相似),实际上没有托管实体和持久性上下文的概念。当我们通过本机查询检索实体时,情况会发生变化。