Hibernate 本机查询:无效的列名错误 SQL-17006
Posted
技术标签:
【中文标题】Hibernate 本机查询:无效的列名错误 SQL-17006【英文标题】:Hibernate native query : Invalid Column Name Error SQL-17006 【发布时间】:2012-10-12 14:26:35 【问题描述】: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属性中指定所有列别名)(我们是否应该在通过setResultSetMapping方法执行查询时再次指定resultsetmapping SQLQuery 接口?)
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
【问题讨论】:
【参考方案1】:我们应该在 Oracle 的 Select 列表中包含所有表列。 如果我们只保留几列。 例如, 您的表 Employee 有列 FirstName,LastName, EmpId, 如果您有类似的查询。
session.createSQLQuery("Select FirstName from Employee");
上面的查询不起作用。它将抛出无效列错误异常。 所以最好把所有列放在 Oracle 的 Select 子句中。
礼貌: one answer 谢谢, 拉杰什。
【讨论】:
谢谢。我几乎花了一整天的时间解决这个问题,终于在这里得到了解决方案。 欢迎德里克。【参考方案2】:改用@Column(name = "myprop")
。另请注意,Type/Type2/Type3 必须是 Simple 类型(通常为 Integer/Long/String/Date)。
【讨论】:
是的,它们都是 Long,String,Date 之一【参考方案3】:好吧,之前我试图在结果集映射中指定列和实体属性,所以我尝试删除实体映射,保留列属性,并调用 aliastobean 结果转换器,再加上编写 setter 来接受 BigDecimal 而不是Long(因为它是 Oracle DB),解决了这个问题......
【讨论】:
【参考方案4】:在我的例子中,我需要给一个内部选择主体命名,因为它神秘地截断了一个 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。
【讨论】:
以上是关于Hibernate 本机查询:无效的列名错误 SQL-17006的主要内容,如果未能解决你的问题,请参考以下文章
hibernate创建本地查询后进行查询的时候报错: could not execute query;列名无效