1

アプリケーションをpostgresデータベースに接続しています。データを保存するための一時テーブルを作成し、ジョブの最後にテーブルを削除する必要があります。

私はJPAを使用していますが、事前にDBにテーブルを作成する必要があるようです。SQLスクリプトを作成するために余分な作業を追加したくないので、ジョブを実行する前にセットアップテーブルに実行する必要があるため、JPAにテーブルを作成します。次に、クエリは通常のCRUD操作を実行しますが、それは機能しません。JPAはその場でテーブルを作成できないためですか?最初にテーブルを作成する必要がありますか?これが私のコードです:

Map<String, String> properties = Maps.newHashMap();
properties.put("javax.persistence.jdbc.url", "jdbc:postgresql://localhost:5432/postgres");
properties.put("javax.persistence.jdbc.user", "postgres");
properties.put("javax.persistence.jdbc.password", "");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("job-postgres", properties);
String queryStr = "CREATE TEMPORARY TABLE tags ("
        + "id SERIAL NOT NULL PRIMARY KEY,"
        + "name varchar(255) NOT NULL,"
        + "type smallint NOT NULL"
        + ")";
Query q = emf.createEntityManager().createQuery(queryStr);

Tag.java:

@Entity
@Table(name="TAGS")
public class Tag implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4762832549003921169L;

    @Id
    @Column(name="id")
    private int _id;

    @Basic
    @Column(name="name")
    private String _name;

    @Basic
    @Column(name="tagtype")
    private int _tagType;

    public Tag() {
        super();
    }

    public Tag(String name, int tagType) {
        _name = name;
        _tagType = tagType;
    }

私が得たエラー:

2013-Feb-08 14:15:06.574    ERROR   o.h.h.PARSER    o.h.h.a.ErrorCounter,56 line 1:1: unexpected token: CREATE
Exception in thread "main" java.lang.IllegalArgumentException: node to traverse cannot be null!
    at org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:63)
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:280)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:268)
4

1 に答える 1

2

EntityManager.createQuery()引数として JPQL クエリを取ります。SQL クエリではありません。

SQL クエリを実行する場合は、 EntityManager.createNativeQuery()を使用します。

于 2013-02-08T22:36:10.227 に答える