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

问题描述 投票:0回答:5
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的columns属性中指定所有列别名)(我们是否应该在通过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
java hibernate jpa orm
5个回答
27
投票

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

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

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

礼貌: 一个答案 谢谢, 拉杰什。


0
投票

尝试使用

@Column(name = "myprop")
。另请注意,Type/Type2/Type3 必须是简单类型(通常为 Integer/Long/String/Date)。


0
投票

嗯,早些时候我试图在结果集映射中指定列和实体属性,所以我尝试删除实体映射,保留列属性,并调用aliastobean结果转换器,再加上编写setter来接受BigDecimal而不是Long(因为它是 Oracle DB),解决了问题...


0
投票

就我而言,我需要给内部选择体一个名称,因为它神秘地截断了 CASE 列。

以下内容不起作用 - 由于某种原因 COLUMN_B 被神秘地删除:

SELECT
  COLUMN_A,
  CASE WHEN ... THEN ... ELSE ... END as COLUMN_B,
  COLUMN_C
FROM (
   ...
)

然后以下解决了问题:

SELECT
  RES.COLUMN_A,
  CASE WHEN ... THEN ... ELSE ... END as COLUMN_B,
  RES.COLUMN_C
FROM (
   ...
) RES

整个SQL只处理一张表。

Java代码:

// The "sql" variable is the SQL statement shown above.
javax.persistence.Query res = myEntityManager.createNativeQuery(sql, SomeClass.class);

🙄

我正在使用带有 JPA 和 Oracle 12c 的 Spring Boot 2.4.3。


0
投票

就我而言,我有一个像这样的本机查询:

@Query(value = "SELECT ID, FIELD1, FIELD2 FROM USERS WHERE FIELD2 = ?1", nativeQuery = true)
    Optional<User> findByUser(String field2);

我在 Oracle 中的表包含所有这些字段:ID、FIELD1、FIELD2、FIELD3、FIELD4,当我运行它时出现错误:“无效的列名错误 SQL-17006”

解决方案:我将所有字段放在查询头中,如下所示:

@Query(value = "SELECT ID, FIELD1, FIELD2, FIELD3, FIELD4 FROM USERS WHERE FIELD2 = ?1", nativeQuery = true)
    Optional<User> findByUser(String field2);

查询头中字段的顺序并不重要。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.