2016-05-31 21 views
0

Hallo Ich versuche, eine native SQL-Abfrage auszuführen, aber immer die Ausnahme, wie untenPSQLException: ERROR: Syntaxfehler bei oder in der Nähe von „Tablename“ Position: 1

Die Abfrage i auszuführen versuche ist wie folgt:

public List<Category> getAllCategories(){ 
    List<Category> categories = getEntityManager().createNativeQuery("Category.getAllAfterMerge", Category.class).getResultList(); 
    return categories; 
} 

und die NamedNative Query ist, wie unten

@NamedNativeQuery(name="Category.getAllAfterMerge", query="SELECT C.ID, C.CODE, COALESCE(R.DISPLAY_NAME, C.NAME) as NAME, C.PARENT_ID, C.PATH, C.COMP_ID, C.CREATED_ON, C.MODIFIED_ON FROM CATEGORY C LEFT JOIN REFERENCE_VALUES R ON C.ID = R.REFERENCE_VALUE_CODE AND R.REFERENCE_OBJ_NAME = 'CATEGORY';") 

die Tabellen sind wie unten

CREATE TABLE category 
(
    id bigserial NOT NULL PRIMARY KEY, 
    code text NOT NULL, 
    name text NOT NULL, 
    parent_id bigint, 
    path text, 
    comp_id bigint, 
    created_on timestamp without time zone, 
    modified_on timestamp without time zone, 
) 

Und die Reference_Values ​​Tabelle ist als unten

CREATE TABLE reference_values 
(
    id serial NOT NULL PRIMARY KEY, 
    reference_obj_name text, 
    reference_value_code bigint, 
    display_name text, 
    created_on timestamp without time zone, 
    modified_on timestamp without time zone, 
) 

Die Einheiten sind wie folgt Category.java

@Entity 
@Table(name = "category") 
@NamedNativeQuery(name="Category.getAllAfterMerge", query="SELECT C.ID, C.CODE, COALESCE(R.DISPLAY_NAME, C.NAME) as NAME, C.PARENT_ID, C.PATH, C.COMP_ID, C.CREATED_ON, C.MODIFIED_ON FROM CATEGORY C LEFT JOIN REFERENCE_VALUES R ON C.ID = R.REFERENCE_VALUE_CODE AND R.REFERENCE_OBJ_NAME = 'CATEGORY';") 
public class Category extends Persistent { 

private static final long serialVersionUID = 1L; 

@ManyToOne 
private Category parent; 

@OneToMany(mappedBy = "parent") 
private Set<Category> children; 

private String code; 

private String name; 

private String path; 

@Column(name = "comp_id") 
private Integer compId; 

Und die ReferenceValues.java wie unten

@Entity 
@Table(name = "reference_values") 
@NamedQuery(name = "ReferenceValues.findAll", query = "SELECT r FROM ReferenceValues r") 
public class ReferenceValues extends Persistent implements Serializable { 
private static final long serialVersionUID = 1L; 

@Column(name = "display_name") 
private String displayName; 

@Column(name = "reference_obj_name") 
private String referenceObjName; 

@Column(name = "reference_value_code") 
private Long referenceValueCode; 

Ausnahme ist als unten:

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692) 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) 
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:492) 
at getAllCategories(JpaCategoryDAO.java:18) 
at CategoryServiceImplTest.testGetAllCategories(CategoryServiceImplTest.java:29) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:670) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106) 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79) 
at org.hibernate.loader.Loader.getResultSet(Loader.java:2115) 
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1898) 
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1874) 
at org.hibernate.loader.Loader.doQuery(Loader.java:919) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 
at org.hibernate.loader.Loader.doList(Loader.java:2610) 
at org.hibernate.loader.Loader.doList(Loader.java:2593) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422) 
at org.hibernate.loader.Loader.list(Loader.java:2417) 
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:336) 
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1980) 
at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:322) 
at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:125) 
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606) 
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483) 
... 31 more 
Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "Category" 
    Position: 1 
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2284) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2003) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:200) 
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424) 
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:161) 
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114) 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) 
... 46 more 
+0

Ist diese Abfrage ausführen, ohne Probleme in Ihrer Postgres-Datenbank? –

+0

@TimBiegeleisen ja die Abfrage läuft in Postgres. – praveen

+0

Kannst du den Befehl hibernate.show_sql aktivieren und sehen, welcher Hibernate tatsächlich ausgeführt wird? –

Antwort

1

Sie benötigen createNamedQuery() Methode für die benannten Abfragen zu verwenden, und fügen Sie resultClass zum @NamedNativeQuery

List<Category> categories = getEntityManager() 
    .createNamedQuery("Category.getAllAfterMerge").getResultList(); 

@NamedNativeQuery(name = "Category.getAllAfterMerge", 
    query = "SELECT C.ID, C.CODE, COALESCE(R.DISPLAY_NAME, C.NAME) as NAME, 
    C.PARENT_ID, C.PATH, C.COMP_ID, C.CREATED_ON, C.MODIFIED_ON 
    FROM CATEGORY C LEFT JOIN REFERENCE_VALUES R ON C.ID = 
    R.REFERENCE_VALUE_CODE AND R.REFERENCE_OBJ_NAME = 'CATEGORY'", 
    resultClass = Category.class) 

Wahrscheinlich müssen Sie Angebote für den Aliasnamen verwenden

COALESCE(R.DISPLAY_NAME, C.NAME) as \"NAME\"

+0

adding resultClass = Category.class hat das Problem gelöst. – praveen

+1

@praveen Ich bin sehr froh. Danke, dass du die Antwort akzeptiert hast. :) –

Verwandte Themen