2016-05-03 14 views
-1

で「関数を作成する」行うことができます。は、どのように私は、次のようにJPAの動的な関数を作成必要JPA

Query query = em.createNativeQuery("CREATE FUNCTION func() ...");` 

その後、私はquery.getSingleResult()を呼び出し、と私はPostgreSQLの機能を見つけることができますが、私も例外を取得する:

Caused by: org.postgresql.util.PSQLException: No results were returned by the query. 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:303) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1009) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:644) 

私はこの例外を停止することができますか?非選択/更新/挿入ステートメントを実行すると、同じ例外が発生する可能性があります。

答えて

0

はこれをやってみてください:

em.getTransaction().begin(); 
query.executeUpdate(); 
em.getTransaction().commit(); 

EDIT 2: @figoによると、これはJTAを使用して動作しません。 em.getTransaction().begin()em.joinTransaction()に置き換えることは、このトリックを行うようです。

+0

NetBeans8.1 + Glassfish4.1を使用していて、Postgres関数を作成するためにServletContextListenerを実装しています。EntityManagerFactory emf = Persistence.createEntityManagerFactory( "persistUnit"); EntityManager em = emf.createEntityManager(); – figo

+0

これはトランザクションの問題の原因になるはずです。それ以外に何ができますか? – figo

+0

begin()とcommit()を使わずに試してください。ちょうどexecuteUpdate() – Ulises

0

私は次のように私のServletContextListenerのimplementionクラスを変更します。

public class SomeListener implements ServletContextListener { 

    @Resource 
    UserTransaction utx; 

    @PersistenceContext(unitName = "persistUnit") 
    private EntityManager em; 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     utx.begin(); 

     // It's important to fix 
     // 'the EntityManager has not been joined to the current transaction.' 
     em.joinTransaction(); 

     Query query = em.createNativeQuery("CREATE FUNCTION func() ..."); 
     query.executeUpdate(); 

     utx.commit(); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
    } 
} 

これが動作することができます。

関連する問題