【问题标题】:"Unknown column" with JPA on AS400 db2在 AS400 db2 上使用 JPA 的“未知列”
【发布时间】:2017-06-22 07:58:01
【问题描述】:

我收到以下错误:

无法执行查询; SQL [选择 DFBOGARM, sum(KVANTUM1) 作为 KVANTUM1,(sum(DSTOMK) * 1000 / sum(KVANTUM1)) 作为 DSTOMK, (sum(DSTAKK) * 1000 / sum(KVANTUMAKK)) 作为 DSTAKK 从 NHODATA.ERHDSTV1 其中 DFSALVAR in(52, 55) 按 DFBOGARM 顺序分组 DFBOGARM];嵌套异常是 org.hibernate.exception.SQLGrammarException:无法执行查询

原因:org.hibernate.exception.SQLGrammarException:不能 执行查询

原因:com.ibm.as400.access.AS400JDBCSQLSyntaxErrorException: An 检测到未定义的列名。

查询实现:

public interface DistributionRepository extends JpaRepository<ERHDSTV1, Long> {

@Query(value="select  "
        + "    DFBOGARM, "
        + "    sum(KVANTUM1) as KVANTUM1, "
        + "    (sum(DSTOMK) * 1000 / sum(KVANTUM1)) as DSTOMK, "
        + " (sum(DSTAKK) * 1000 / sum(KVANTUMAKK)) as DSTAKK "
        + "from NHODATA.ERHDSTV1 "
        + "where DFSALVAR in(52, 55) "
        + "group by DFBOGARM "
        + "order by DFBOGARM", nativeQuery = true)
List<ERHDSTV1> findSummedValuesFor52and55();}

实体类:

@Entity
@IdClass(ERHDSTV1Id.class)
@Table(name = "ERHDSTV1")
@Data
public class ERHDSTV1 {
   @Id
   @Column(name = "DFBOGARM")
   private String yearMonth;
   @Id
   @Column(name = "DFSALVAR")
   private Long salesType;
   @Column(name = "KVANTUM1")
   private Long volumeOne;
   @Column(name = "DSTOMK")
   private Long distributionCosts;
   @Column(name = "DSTMDN")
   private Long distributionMedian;
   @Column(name = "KVANTUMAKK")
   private Long volumeAccumulated;
   @Column(name = "DSTAKK")
   private Long distributionAccumulated;
   @Column(name = "DSTMNDAKK")
   private Long distributionMedianAccumulated;
}

当从 sql 工具执行时,来自错误消息的查询完美执行。

标题是:DFBOGARM、KVANTUM1、DSTOMK、DSTAKK

【问题讨论】:

  • 您的 DBMS 是否希望您的列名使用小写?消息是否指定了据称未定义的列名?你能让你的应用打印出实际生成的 SQL 吗?
  • 更新了,但是,没有,没有提到具体的列,而且,它是大写还是小写都没有关系。
  • 似乎错误表明SQL查询错误,您是否尝试过直接针对您的数据库运行它?
  • "从错误消息中的查询完美执行,当从 sql 工具执行时"

标签: java jpa spring-data-jpa


【解决方案1】:

好的,所以错误是我必须为上面的每一列选择值。

这意味着我做了这样的查询:

@Query(value = "select  "
        + "    DFBOGARM, 1 as DFSALVAR, 1 as DSTMND, 1 as DSTMNDAKK, 1 as KVANTUMAKK, "
        + "    sum(KVANTUM1) as KVANTUM1, "
        + "    (sum(DSTOMK) * 1000 / sum(KVANTUM1)) as DSTOMK, "
        + " (sum(DSTAKK) * 1000 / sum(KVANTUMAKK)) as DSTAKK "
        + "from NHODATA.ERHDSTV1 "
        + "where DFSALVAR in(52, 55) "
        + "group by DFBOGARM "
        + "order by DFBOGARM", nativeQuery = true)

而且成功了。

【讨论】:

  • 我在列大写名称方面遇到了类似的问题。此答案有助于解决问题。
猜你喜欢
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
相关资源
最近更新 更多