【问题标题】:Java JPA setParameter date objectJava JPA setParameter 日期对象
【发布时间】:2017-09-06 18:22:36
【问题描述】:

我的 PostgreSQL 数据库中有这个功能。

create or replace function borrowaCar(integer,integer,date) returns boolean language 'plpgsql' as'
declare 
    borrow boolean;
begin
     if exists(select * from availableCars where id=$2)then
            insert into Borrows (car_id_car, person_id_person, borrow_date, return_date) values ($2,$1,$3, NULL);
            update Car set is_borrow=true where id_car=$2;
            return true;
     end if;
    return false;
end;
';

当我构建查询时,我想在 YYYY-MM-DD 中添加实际日期,例如 2017-09-06。我写了这段代码:

Query query = entityManager.createNativeQuery("SELECT borrowaCar(?,?,?)");          
query.setParameter(1, idPerson);
query.setParameter(2, idCar);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
query.setParameter(3, sdf.format(date));

但是这个解决方案返回错误:

org.postgresql.util.PSQLException: 错误: function borrowacar(integer, 整数,字符变化)不存在 Wskazówka:没有功能 匹配给定的名称和参数类型。您可能需要添加 显式类型转换。

有什么问题?

【问题讨论】:

  • sdf.format 返回一个字符串
  • 是的,我猜。如何纠正这个问题?
  • 如果borrow_date的类型是日期,那么不要使用sdf.format,直接取日期。如果类型是 charvar,则将函数签名从 int,int,date 更改为 int,int,String
  • 好的,但是我表中的字段是日期类型。
  • 所以试试 query.setParameter(3, date);

标签: java postgresql jpa


【解决方案1】:

问题是你定义的函数

borrowaCar(integer, integer, date)  

与您的参数不匹配:

borrowacar(integer, integer, character varying)

sdf.format(date) 的调用返回一个字符串并被解释为“字符变化”。您需要采用表借用列借用日期中定义的类型。

【讨论】:

  • 是的,我知道 sdf.format(date) 返回字符串。我想将对象放到我的函数中,而不是带有字符变量的字符串。
  • 你可以尝试转换:.....values ($2,$1,CAST($3 AS DATETIME), NULL);或类似的东西。然后,您需要将 borrowaCar(integer, integer, date) 更改为 borrowacar(integer, integer, character varying)。如果您只是更改方法签名而不进行转换,可能会有自动转换
  • 好的,谢谢,我试试。不能返回只有年、月、日的日期对象吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2013-08-31
  • 2012-06-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多