Получить результат с помощью процедуры PostgreSQL с использованием Hibernate - PullRequest
1 голос
/ 30 декабря 2011

Я пытаюсь получить значение из базы данных postgres, используя функцию plpgsql Примечание редактора: OP имел plsql, но я не могу получить данные.

Я получаю следующее исключение:

Исключение в потоке "main" java.lang.UnsupportedOperationException: org.hibernate.dialect.PostgreSQLDialect не поддерживает наборы результатов с помощью хранимых процедур

Файл конфигурации моего гибернации:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://192.168.1.100:54321/localDB</property>
    <!--    <property name="hibernate.connection.url">jdbc:postgresql://192.168.1.100:54321/scprj</property>-->
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">dbserver</property>
    <property name="hibernate.show_sql">true</property>
    <mapping resource="hibernate.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Файл отображения моего гибернации:

<?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>
    <class name="callFunctionPack.DateBean" table="userlogin">
        <id column="userid" name="userid">
            <generator class="increment"/>
        </id>
        <property column="username" name="username" type="string"/>
        <property column="password" name="password" type="string"/>
    </class>

    <sql-query name="getlogin" callable="true" comment="Call the getlogindata procedure">>
      <return class="callFunctionPack.DateBean">
        <return-property name="username" column="username"/>
        <return-property name="password" column="password"/>
      </return>
      { call getlogin(:userid) }
    </sql-query>
</hibernate-mapping>

Моя основная функция класса для процедуры:

public class Call {

    public static void main(String... args) {
        //select();
        show();
    }
    public static void show() {
        Query nQuery = getSession().getNamedQuery("getlogin").setParameter("userid", 1);
        List results = nQuery.list();
        for (Iterator it = results.iterator(); it.hasNext();) {
            DateBean dateBean = (DateBean)it.next();
            System.out.println(dateBean.getUsername());
            System.out.println(dateBean.getPassword());
        }
    }
    public static Session getSession() {
        Session session = new Configuration().configure().buildSessionFactory().openSession();
        return session;
    }
}

Мой класс бинов:

public class DateBean {
    private String date;
    private int userid;
    private String username;
    private String password;

    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

Моя функция plpgsql:

CREATE OR REPLACE FUNCTION getlogindata(numeric)
  RETURNS refcursor AS
$BODY$
    DECLARE

        p_userid            ALIAS FOR $1;

        sql_stmt            VARCHAR;
        p_condition         VARCHAR;
        v_boolean           BOOLEAN := false;
        email_tracking_cursor       REFCURSOR;
    BEGIN
    sql_stmt := 'SELECT USERNAME, PASSWORD FROM USERLOGIN WHERE USERID =' || p_userid;

    raise notice '%',sql_stmt;
        OPEN email_tracking_cursor FOR EXECUTE sql_stmt;
        RETURN email_tracking_cursor;

     END; $BODY$
  LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION getlogindata(numeric) OWNER TO postgres;

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Ваша plpgsql функция возвращает не «значение», а курсор.Эта функция делает то, что вам нужно:

CREATE OR REPLACE FUNCTION getlogindata(numeric, OUT username text, OUT password text)
  RETURNS record AS
$BODY$
    SELECT u.username, u.password FROM userlogin u WHERE u.userid = $1;
$BODY$
  LANGUAGE sql STABLE;

Вы также можете использовать простой SQL для этого простого запроса:

SELECT username, password FROM userlogin WHERE userid = $my_userid;
1 голос
/ 30 декабря 2011

Я не очень хорошо знаю Hibernate, но вы можете изменить функцию, чтобы она была определена как "RETURNS TABLE", а затем вы можете сделать select * from getlogindata(42);.

Возможно, Hibernate сможет работать с этим решением.

...