【问题标题】:HSQLException on session.list. Error: Unexpected token "Entity name"session.list 上的 HSQLException。错误:意外的令牌“实体名称”
【发布时间】:2015-12-21 12:43:21
【问题描述】:

我正在为其中一个项目进行休眠/JPA 设置,但遇到了奇怪的错误。

每当我尝试调用 session.list() 时,我首先会收到以下警告。

6565 [main] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - SQL Error: -5581, SQLState: 42581 

在此之后,我收到以下错误。

意外令牌:ADSUBCONTE8_

详细的堆栈跟踪:-

org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:188)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:159)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1858)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1835)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1815)
    at org.hibernate.loader.Loader.doQuery(Loader.java:899)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
    at org.hibernate.loader.Loader.doList(Loader.java:2522)
    at org.hibernate.loader.Loader.doList(Loader.java:2508)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2338)
    at org.hibernate.loader.Loader.list(Loader.java:2333)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1662)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)

Caused by: java.sql.SQLSyntaxErrorException: unexpected token: ADSUBCONTE8_
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:281)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:161)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    ... 49 more
Caused by: org.hsqldb.HsqlException: unexpected token: ADSUBCONTE8_
    at org.hsqldb.error.Error.parseError(Unknown Source)
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
    at org.hsqldb.ParserDQL.XreadSimpleValueExpressionPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesValueExpressionPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesFactor(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesTerm(Unknown Source)
    at org.hsqldb.ParserDQL.XreadAllTypesCommonValueExpression(Unknown Source)
    at org.hsqldb.ParserDQL.XreadValueExpression(Unknown Source)
    at org.hsqldb.ParserDQL.XreadSelect(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
    at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
    at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
    at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
    at org.hsqldb.Session.compileStatement(Unknown Source)
    at org.hsqldb.StatementManager.compile(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 55 more

manyToOne 关系中两个类的 java 类如下(兴趣线突出显示)

/**
 * The persistent class for the ad_context_tags database table.
 * 
 */
@Entity
@Table(name = "ad_context_tags")
@NamedQuery(name = "AdContextTagEntity.findAll", query = "SELECT a FROM AdContextTagEntity a")
public class AdContextTagEntity implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(unique = true, nullable = false)
    private int id;

    @Column(name = "created_by", nullable = false, length = 100)
    private String createdBy;

    @Temporal(TemporalType.DATE)
    @Column(name = "creation_date", nullable = false)
    private Date creationDate;

    @Temporal(TemporalType.DATE)
    @Column(name = "last_update_date")
    private Date lastUpdateDate;

    // bi-directional many-to-one association to AdCategoryEntity
    @ManyToOne
    @JoinColumn(name = "category", nullable = false)
    private AdCategoryEntity adCategory;

    // bi-directional many-to-one association to AdPageInfoEntity
    @ManyToOne
    @JoinColumn(name = "page_info", nullable = false)
    private AdPageInfoEntity adPageInfo;

    // bi-directional many-to-one association to AdSlotFamilyEntity
    @ManyToOne
    @JoinColumn(name = "`slot_group`", nullable = false)
    private AdSlotFamilyEntity adSlotFamily;

    // bi-directional many-to-one association to MarketplaceMappingEntity
    @ManyToOne
    @JoinColumn(name = "siterealm")
    private LegacyMarketplaceMappingEntity marketplaceMapping;

// ========== the field that gives the error below. Class defined later in the post ======
        @ManyToOne
        @JoinColumn(name = "subcontext")
        private AdSubcontextEntity subcontextEntity;

        public AdSubcontextEntity getSubcontextEntity()
        {
             return subcontextEntity;
        }

         public void setSubcontextEntity(AdSubcontextEntity subcontextEntity)
         {
             this.subcontextEntity = subcontextEntity;
          }


    public AdContextTagEntity()
    {
    }

    public int getId()
    {
        return this.id;
    }

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

    public String getCreatedBy()
    {
        return this.createdBy;
    }

    public void setCreatedBy(String createdBy)
    {
        this.createdBy = createdBy;
    }

    public Date getCreationDate()
    {
        return this.creationDate;
    }

    public void setCreationDate(Date creationDate)
    {
        this.creationDate = creationDate;
    }

    public Date getLastUpdateDate()
    {
        return this.lastUpdateDate;
    }

    public void setLastUpdateDate(Date lastUpdateDate)
    {
        this.lastUpdateDate = lastUpdateDate;
    }

    public AdCategoryEntity getAdCategory()
    {
        return this.adCategory;
    }

    public void setAdCategory(AdCategoryEntity adCategory)
    {
        this.adCategory = adCategory;
    }

    public AdPageInfoEntity getAdPageInfo()
    {
        return this.adPageInfo;
    }

    public void setAdPageInfo(AdPageInfoEntity adPageInfo)
    {
        this.adPageInfo = adPageInfo;
    }

    public AdSlotFamilyEntity getAdSlotFamily()
    {
        return this.adSlotFamily;
    }

    public void setAdSlotFamily(AdSlotFamilyEntity adSlotFamily)
    {
        this.adSlotFamily = adSlotFamily;
    }

    public LegacyMarketplaceMappingEntity getMarketplaceMapping()
    {
        return this.marketplaceMapping;
    }

    public void setMarketplaceMapping(LegacyMarketplaceMappingEntity marketplaceMapping)
    {
        this.marketplaceMapping = marketplaceMapping;
    }

    public DcAdLocation constructSerializable()
    {
        // TODO Auto-generated method stub
        return new DcAdLocation();
    }

}

有问题的课程如下:-

@Entity
@Table(name="ad_subcontext")
@NamedQuery(name="AdSubcontextEntity.findAll", query="SELECT a FROM AdSubcontextEntity a")
public class AdSubcontextEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private int id;

    @Column(nullable=false, length=20)
    private String primary;

    @Column(length=11)
    private String secondary;

    public int getId() {
        return this.id;
    }

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

    public String getPrimary() {
        return this.primary;
    }

    public void setPrimary(String primary) {
        this.primary = primary;
    }

    public String getSecondary() {
        return this.secondary;
    }

    public void setSecondary(String secondary) {
        this.secondary = secondary;
    }


}

hibernate生成的SQL如下:-

/**
 * select this_.id as id1_6_7_, this_.category as category5_6_7_,
 * this_.page_info as page6_6_7_, this_."slot_group" as slot7_6_7_,
 * this_.created_by as created2_6_7_, this_.creation_date as creation3_6_7_,
 * this_.foo as foo8_6_7_, this_.last_update_date as last4_6_7_, this_.siterealm
 * as sitereal9_6_7_, adcategory2_.id as id1_3_0_, adcategory2_.name as
 * name2_3_0_, adpageinfo3_.id as id1_8_1_, adpageinfo3_.page_family as
 * page5_8_1_, adpageinfo3_.browse_node as browse2_8_1_, adpageinfo3_.page_name
 * as page3_8_1_, adpageinfo3_.page_short_name as page4_8_1_, adpageamab4_.id as
 * id1_7_2_, adpageamab4_.amabotId as amabotId2_7_2_, adpageamab4_.family as
 * family3_7_2_, adslotfami5_.id as id1_12_3_, adslotfami5_."slot_family_name"
 * as slot2_12_3_, foo6_.id as id1_0_4_, foo6_.primary as primary2_0_4_,
 * foo6_.secondary as secondar3_0_4_, legacymark7_.id as id1_24_5_,
 * legacymark7_.client_id as client4_24_5_, legacymark7_.client_zone as
 * client2_24_5_, legacymark7_.marketplace_id as marketpl3_24_5_,
 * legacyclie8_.id as id1_19_6_, legacyclie8_.client_name as client2_19_6_ from
 * ad_context_tags this_ inner join ad_category adcategory2_ on
 * this_.category=adcategory2_.id inner join ad_page_info adpageinfo3_ on
 * this_.page_info=adpageinfo3_.id left outer join ad_page_amabot_mapping
 * adpageamab4_ on adpageinfo3_.page_family=adpageamab4_.id inner join
 * ad_slot_family adslotfami5_ on this_."slot_group"=adslotfami5_.id inner join
 * Foo foo6_ on this_.foo=foo6_.id left outer join marketplace_mappings
 * legacymark7_ on this_.siterealm=legacymark7_.id left outer join clients
 * legacyclie8_ on legacymark7_.client_id=legacyclie8_.id
 */

我也做了一些调查,看起来这个 ADSUBCONTE8 无论如何都会生成。我尝试将其重命名为 Crap.java,但随后我不断收到错误,因为意外令牌 Crap6。 如果我尝试从父 AdContextTagEntity 中删除 AdSubContext,测试和构建都可以通过。

请帮帮我,因为我真的被困在这个问题上了。

【问题讨论】:

  • 在发布的 SQL 查询中没有出现意外的标记。
  • 它在堆栈跟踪中。关于令牌 ADSUBCONTE8_

标签: java sql hibernate hsqldb


【解决方案1】:

首先你是对的,警告和异常是相互关联的。警告和异常都指向 here 指定的意外令牌。


异常不在 Hibernate 中,但可能在 HSQLDB 中。子查询似乎是问题所在。 Hsqldb 似乎无法解析子查询。我们可以尝试一些东西。(如果您已经尝试过,请道歉)

  1. 尝试更改primarysecondary 的列名。基本上检查保留字,因为在命名时使用一些可能会出现此错误。
  2. 检查您的 SQL 文件是否在独立模式下正确执行,并创建具有所有预期约束的所有表,尤其是与 ad_subcontext 表相关的所有表。在生成的查询中发现很多您添加为问题的查询。在您的数据库上尝试类似的 SQL,我很确定它会出现类似的错误。

【讨论】:

    【解决方案2】:

    看起来 SQL 是由您生成的,没有“subcontextEntity”字段,因为它不包含对表 ad_subcontext 的连接。

    异常不在 Hibernate 中,而是在 HSQLDB 驱动程序中。因此,由于某些原因,驱动程序无法解析 SQL。

    可能的原因:

    使用“primary”、“secondary”作为字段名称——这些名称可以保留为主键和辅助键。

    中使用奇怪的名称“`slot_group`”
    @JoinColumn(name = "`slot_group`", nullable = false)
    

    或其他“字段名称”原因。

    【讨论】:

    • 非常感谢。主要和次要字段名称就是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2018-05-14
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多