Hibernate 本机查询:无效的列名错误 SQL-17006

新手上路,请多包涵
package com.abc.def.model;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.Embeddable;
import javax.persistence.IdClass;
import java.util.Date;
import java.io.Serializable;

@NamedNativeQuery(name="getMetadata",query="
                  select a.name alias1,a.fullname alias2,
                         b.name alias3,b.age alias4,
                         c.height alias5,c.something alias6,
                         d.otherthing alias7
                  from lame_table_name a,
                       lame_table_name_2 b
                  where a.id = b.id
                     and b.id = c.id
                     and c.id = d.id
                     and d.id = :namedparameter
                  order by a.index,b.index
               ",
            resultClass=MetadataModel.class)

  @Entity
  @IdClass(SomeIdClass.class)

  public class MetadataModel{

  @Id @Column("alias1")
  private Type alias1property;

  @Id @Column("alias2")
  private Type2 alias2property;

  @Column("alias3")
  private Type3 alias3property;

  //getters and setters
  }

  @Embeddable
  class SomeIdClass implements Serializable{

  //serialVersionUID line

  @Id @Column("alias1")
  private Type alias1property;

  @Id @Column("alias2")
  private Type2 alias2property;

  //getter and setters
  }

错误是 SQL-17006,无效的列名,一整天都在尝试这个设置的变体 我应该尝试把 Column(“lame_table_name.name”)

我还尝试使用 SqlResultSetMapping(并从 POJO 的字段中删除@Column)(并在 SqlResultSetMapping 的列属性中指定所有列别名)(我们是否应该在通过 SQLQuery 接口的 setResultSetMapping 方法执行查询时再次指定结果集映射?)

 package com.abc.def.model;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.Embeddable;
import javax.persistence.IdClass;
import java.util.Date;
import java.io.Serializable;
//other imports for the SqlResultSetMapping

@NamedNativeQuery(name="getMetadata",query="
                  select a.name alias1,a.fullname alias2,
                         b.name alias3,b.age alias4,
                         c.height alias5,c.something alias6,
                         d.otherthing alias7
                  from lame_table_name a,
                       lame_table_name_2 b
                  where a.id = b.id
                     and b.id = c.id
                     and c.id = d.id
                     and d.id = :namedparameter
                  order by a.index,b.index
               ",
            resultSetMapping="metaDataMapping")

@SqlResultSetMapping(name="metaDataMapping",
              entities=@EntityResult(entityClass=MetadataModel.class,
                fields = {@FieldResult(name="alias1Property",column="alias1")
                           //so on
                      }

                 )
            )

  @Entity
  @IdClass(SomeIdClass.class)

  public class MetadataModel{

  private Type alias1property;

  private Type2 alias2property;

  private Type3 alias3property;

  //getters and setters
  }

  //composite class, exactly as above

原文由 cee_el 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

好吧,早些时候我试图在结果集映射中指定列和实体属性,所以我尝试删除实体映射,保留列属性,并调用别名结果转换器,加上编写设置器以接受 BigDecimal 而不是 Long(因为它是一个 Oracle 数据库),解决了这个问题……

原文由 cee_el 发布,翻译遵循 CC BY-SA 3.0 许可协议

我们应该在 oracle 的选择列表中包含所有表列。如果我们只保留几列。例如,您的表 Employee 有 FirstName、LastName、EmpId 列,如果您有类似 .

 session.createSQLQuery("Select FirstName from Employee");

上面的查询将不起作用。它将抛出无效列错误异常。所以最好将所有列放在 Oracle 的 Select 子句中。

礼貌: 一个答案 谢谢,Rajesh。

原文由 Rajesh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题