簡體   English   中英

嘗試使用Hibernate和PostgreSQL執行存儲過程時出錯

[英]Error trying to execute a stored procedure with Hibernate and PostgreSQL

我正在嘗試使用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();

我總是得到同樣的錯誤: There is a problema with the postgreSQLDialect

我嘗試使用select * from getnotificaciones (:idusuario)但在這種情況下我得到“無法執行查詢”錯誤消息。

誰能幫我?

看起來Java無法獲取RETURNS SETOF record ,您可以找到該部分的一些參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM