【问题标题】:javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute queryjavax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:无法执行查询
【发布时间】:2017-09-28 08:53:04
【问题描述】:

我有课

@SuppressWarnings("JpaQlInspection")   
@Entity   
@Table(name = "tickets", indexes = {  
    @Index(name = "cancelation_Date", columnList = "cancelation_Date"),  
    @Index(name = "pos_id", columnList = "pos_id"),  
    @Index(name = "flag", columnList = "flag")  
})  
@SqlResultSetMapping(  
    name = "TicketMapping",  
    entities = @EntityResult(  
        entityClass = Ticket.class,  
        fields = {  
            @FieldResult(name = "id", column = "id"),  
            @FieldResult(name = "version", column = "version"),  
            @FieldResult(name = "pos_id", column = "pos_id"),  
            @FieldResult(name = "cancelation_date", column = "cancelation_date"),
            @FieldResult(name = "cost", column = "cost"),  
            @FieldResult(name = "flag", column = "flag"),  
        }  
    )  
)  

public class Ticket extends BaseEntity {

    @Column(name = "pos_id", length = 12)
    private String posId;

    @Column(name = "cost", length = 10)
    private String cost;

    @Column(name = "cancelation_date")
    private String cancelationDate;

    @Column(name = "flag", length = 10)
    private String flag;

    public String getPosId() {
        return posId;
    }

    public void setPosId(String posId) {
        this.posId = posId;
    }

    public String getCost() {
        return cost;
    }

    public void setCost(String cost) {
        this.cost = cost;
    }

    public String getCancelationDate() {
        return cancelationDate;
    }

    public void setCancelationDate(String cancelationDate) {
        this.cancelationDate = cancelationDate;
    }

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag;
    }
}

@MappedSuperclass
public abstract class BaseEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "generator")
    @TableGenerator(name = "generator", table = "sequence_list", pkColumnName = "name", allocationSize = 50, initialValue = 3000)
    @Column(name = "id")
    protected Long id;

    @Version
    private Long version;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public boolean isNew() {
        return (this.id == null);
    }
}

我正在使用 postgres 9.6。我在以下情况出现错误:

Query query = this.entityManager.createNativeQuery(searchQuery,"TicketMapping");

return query.getResultList();

错误日志:

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1419) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.query.Query.getResultList(Query.java:146) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:372) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at com.sun.proxy.$Proxy39.getResultList(Unknown Source) ~[na:na]
    at vn.com.bgt.lottery.dao.jpa.JpaTicketDao.search(JpaTicketDao.java:29) ~[classes/:na]
    at vn.com.bgt.lottery.TicketSearchUtil.search(TicketSearchUtil.java:89) ~[classes/:na]
    at vn.com.bgt.lottery.Console.exportTickets(Console.java:72) [classes/:na]
    at vn.com.bgt.lottery.Console.main(Console.java:59) [classes/:na]
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2618) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2598) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2425) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2153) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:991) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:147) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    ... 11 common frames omitted
Caused by: org.postgresql.util.PSQLException: The column name id was not found in this ResultSet.
    at org.postgresql.jdbc.PgResultSet.findColumn(PgResultSet.java:2608) ~[postgresql-42.0.0.jre6.jar:42.0.0.jre6]
    at org.postgresql.jdbc.PgResultSet.getLong(PgResultSet.java:2505) ~[postgresql-42.0.0.jre6.jar:42.0.0.jre6]
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.getLong(NewProxyResultSet.java:2625) ~[c3p0-0.9.1.2.jar:0.9.1.2]
    at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:63) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:260) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:256) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:246) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:332) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:802) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:727) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.processResultSet(Loader.java:985) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:943) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2615) ~[hibernate-core-5.2.8.Final.jar:5.2.8.Final]
    ... 19 common frames omitted

【问题讨论】:

    标签: java postgresql hibernate jpa


    【解决方案1】:

    您的查询语法不正确:

    Query query = this.entityManager.createNativeQuery(searchQuery, "TicketMapping");
    //--------------------------------------------------------------------^^
    //This should be the ObjectName.class
    

    所以你的查询应该是这样的:

    Query query = this.entityManager.createNativeQuery("YourQuery", ObjectName.class);
    

    或者只是:

    Query query = this.entityManager.createNativeQuery("YourQuery");
    List<ObjectName> list = query.getResultList();
    return list;
    

    【讨论】:

    • 感谢 YCF_L 。 2 案例你支持我:Query query = this.entityManager.createNativeQuery("YourQuery");列表 列表 = query.getResultList();返回列表;没关系。另一种情况是同样的错误。感谢您的帮助
    • 查询查询 = this.entityManager.createNativeQuery("YourQuery"); List list = query.getResultList();返回列表;此处的列表不是 Ticket 的列表。那是一个对象列表。当我尝试投到票时,我得到了错误 Ljava.lang.Object;无法转换为 vn.com.bgt.lottery.domain.Ticket
    • 查询查询 = this.entityManager.createNativeQuery(searchQuery, "TicketMapping");是查询 javax.persistence.EntityManager.createNativeQuery(String sqlString, String resultSetMapping)。我在问题的顶部创建了@SqlResultSetMapping(name = "TicketMapping" ...。
    • 我不明白你@HienVu 吗?
    • 嗨 YCF_L 。查询查询 = this.entityManager.createNativeQuery("YourQuery");列表 列表 = query.getResultList();我无法访问列表。
    【解决方案2】:

    用那个改变你的结果集:

    @SqlResultSetMapping(  
        name = "TicketMapping",  
        entities = @EntityResult(  
                entityClass = Ticket.class,  
                fields = {  
                        @FieldResult(name = "version", column = "version"),  
                        @FieldResult(name = "pos_id", column = "pos_id"),  
                        @FieldResult(name = "cancelation_date", column = "cancelation_date"),  
                        @FieldResult(name = "cost", column = "cost"),  
                        @FieldResult(name = "flag", column = "flag"),  
                }  
        )  
    )  
    

    你的错误是告诉你你的 id 有问题。我认为这将暂时解决它。

    【讨论】:

    • 嗨 gen,Strash。我尝试但我点了同样的错误。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2016-08-30
    • 2015-10-06
    • 2023-03-03
    • 2011-10-17
    • 2017-02-23
    相关资源
    最近更新 更多