gpt4 book ai didi

java - 尝试使用 Hibernate 和 PostgreSQL 执行存储过程时出错

转载 作者:行者123 更新时间:2023-11-29 12:47:29 31 4
gpt4 key购买 nike

我正在尝试使用 hibernate (Java Persistence API)和 postgreSQL 执行存储过程。我的映射文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<sql-query name="getnotificaciones" callable="true">
<return alias="notificacion"
class="tempranillo.entidades.sistemanotificaciones.NotificacionDB" lock-mode="read">
<return-property name="fecha" column="fecha"/>
<return-property name="notificacion" column="notificacioncolumn"/>
<return-property name="xmlnotificacion" column="xmlcolumn"/>
</return>
{call getnotificaciones(:idusuario)}
</sql-query>
</hibernate-mapping>

存储过程如下所示:

CREATE OR REPLACE FUNCTION getNotificaciones(idusuario  int4,
OUT fecha date,
OUT notificacioncolumn varchar,
OUT xmlcolumn xml
)
RETURNS SETOF record
AS $$
SELECT
INFONOT.fecha,
INFONOT.notificacion,
xmlelement (name notificacion, xmlattributes(current_date as "fecha",
INFONOT.xmlTipoNotificacion as "tipoNotificacion"),
xmlelement (name infovino,
xmlforest(
tvinos.idvino,
tvinos.nombre,
tvinos.tipovino,
tvinos.anio,
tvinos.variedad,
tvinos.zona,
tvinos.pais)
),
xmlelement (name infousuario,
xmlforest(
tusuarios.idusuario,
tusuarios.ALIAS)
),
xmlelement (name infologro,
xmlforest(
tlogros.idlogro,
tlogros.nombrelogro,
tlogros.descripcion
)
)
)
FROM
public.tusuarios
INNER JOIN
(SELECT DISTINCT(xpath('//Notificacion/usuarioOrigina
/id/text()',xmlnotificacion::xml))[1]::varchar::int4 as xmlidusuario,
(xpath('//Notificacion/vino/idvino/text()',xmlnotificacion::xml
[1]::varchar::int4 as XMLIDVINO,
(xpath('//Notificacion/tipoNotificacion/text()',xmlnotificacion::xml
[1]::varchar as xmlTipoNotificacion,
(xpath('//Notificacion/Logro/IdLogro/text()',xmlnotificacion::xml
[1]::varchar::int4 as xmlIdLogro,
public.tnotificacion.idnotificacion,
public.tnotificacion.fecha,
public.tnotificacion.notificacion
FROM
public.tamistad RIGHT OUTER JOIN public.tnotificacion ON
(public.tamistad.idamigo= public.tnotificacion.idusuario)
WHERE (public.tamistad.idusuario = $1 OR public.tnotificacion.idusuario = $1) AND
public.tnotificacion.xmlnotificacion IS NOT NULL) AS INFONOT
ON (public.tusuarios.idusuario = INFONOT.xmlidusuario)
LEFT OUTER JOIN public.tvinos
on (public.tvinos.idvino = INFONOT.xmlidvino)
LEFT OUTER JOIN public.tlogros
on (public.tlogros.idlogro = INFONOT.xmlIdLogro)
ORDER BY
INFONOT.fecha DESC;
$$ LANGUAGE SQL;

java中声明的实体如下:

package tempranillo.entidades.sistemanotificaciones;

public class NotificacionDB implements Serializable {

public NotificacionDB() {
}

public NotificacionDB(int idusuario,
Date fecha,
String notificacion) {
this.idusuario = idusuario;
this.fecha = fecha;
this.notificacion = notificacion;
}

public NotificacionDB(int idusuario,
Date fecha,
String notificacion,
String xmlnotificacion) {
this.idusuario = idusuario;
this.fecha = fecha;
this.notificacion = notificacion;
this.xmlnotificacion = xmlnotificacion;
}


private int idnotificacion;

public int getIdnotificacion() {
return idnotificacion;
}

private void setIdnotificacion(int idnotificacion) {
this.idnotificacion = idnotificacion;
}
private int idusuario;

public int getIdusuario() {
return idusuario;
}

public void setIdusuario(int idusuario) {
this.idusuario = idusuario;
}
private Date fecha;

public Date getFecha() {
return fecha;
}

public void setFecha(Date fecha) {
this.fecha = fecha;
}
private String notificacion;

public String getNotificacion() {
return notificacion;
}

public void setNotificacion(String notificacion) {
this.notificacion = notificacion;
}

private String xmlnotificacion;

public String getXmlnotificacion() {
return xmlnotificacion;
}

public void setXmlnotificacion(String xmlnotificacion) {
this.xmlnotificacion = xmlnotificacion;
}

}

当我尝试执行以下代码时:

   Query query = sesion.getNamedQuery("getnotificaciones");
query.setInteger("idusuario", idusuario);
List listanotificaciones = query.list();

我总是得到同样的错误:PostgreSQLDialect 有问题

我尝试使用 select * from getnotificaciones (:idusuario) 但在这种情况下我收到“无法执行查询”错误消息。

谁能帮帮我?

最佳答案

Java 似乎无法接受您的RETURNS SETOF 记录,您可以找到该部分的一些引用资料。

关于java - 尝试使用 Hibernate 和 PostgreSQL 执行存储过程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035135/

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