我在一个springmvc项目中使用springdatajpa和hibernate,我使用在扩展JpaRepository的接口中声明的本地查询,如下所示:
public interface I_Table_one extends JpaRepository<table_id, Long>{
@Query(value ="select name_att, .... .... various att"
+ "from Table_one "
+ "where id_table = 4 ",
nativeQuery = true)
public List<Table_one_Mapped_Class>serachInTable();
这个方法没有多大意义。只是一个例子,我有一个在select中有80个属性的方法。我只想知道有一种方法可以知道我错了什么列名。
我的映射类:
@Entity
@Table(name="Table_one")
public class Table_one_Mapped_Class implements Serializable {
private static final long serialVersionUID = 1L;
////ID///////
@Id
@Column (name="ID_TABLE", nullable=false)
private Long idInMyTable;
////ID///////
.....other columns
这是我的hibernate属性配置:
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
jpaProperties.put("hibernate.format_sql", true);
jpaProperties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
jpaProperties.put("hibernate.show_sql", true);
当我试图在像${value}
这样的html页面中打印控制器类的值时,我得到了以下错误
我在控制台中得到这个错误:
警告:org.hubinate.engine.jdbc.spi.SqlExceptionHelper-SQL错误:17006,SQL状态:99999
错误:org.hubinate.engine.jdbc.spi.SqlExceptionHelper-列名无效
当我试图打开页面时出现这个错误
请求处理失败;嵌套异常为org.springframework.org.jpa.JpaSystemException:org.hibernate.exception.GenericJDBCException:无法执行查询;嵌套异常为javax.persistence.PersistenceException:org.hibernate.exeption.GenericJDBCException:无法执行查询
控制台上写着:
无效列名
但是,我如何知道哪一列的名称无效,在我放入接口方法的查询中,或者在我映射的类中的属性名称无效
我也看到过类似的问题,有人发帖说我需要选择select中的所有列才能工作,但为什么我只需要select中的几个列?我需要选择所有列吗?即使不需要它们?
如果您使用的是Spring Data JPA>1.4,那么您可以创建一个DTO类,该类正好包含表中所需的属性。
一个示例DTO和-Query看起来是这样的,那么:
查询:
@Query("select new de.mypackage.mymodel.dto.myDTO(name_Att, att2,, att3)" +
" from Table_One " +
"where ...")
List<myDTO> getAttributesFromBigTable(String name_Attribute,
String attribute2, String attribute3);
DTO:
public class myDTO {
private String name_attr;
private String attr2;
private String attr3;
public myDTO(String name_attr, String attr2, String attr3) {
this.name_attr = name_attr;
this.attr2 = attr2;
this.attr3 = attr3;
}
public String getName_Attr() {
return name_attr;
}
...
}