【问题标题】:java.sql.SQLSyntaxErrorException: No such column: idjava.sql.SQLSyntaxErrorException:没有这样的列:id
【发布时间】:2019-09-28 21:29:30
【问题描述】:
java.sql.SQLSyntaxErrorException: No such column: id

当表中已经包含id列时

我正在尝试使用来自存储库类的 MariaDB SQL 中的预期结果运行以下本机 SQL 查询:

SELECT name
FROM table1 t1
WHERE t1.table2_id IN (
  SELECT id
  FROM table2 t2
  WHERE t2.column1_number = 1 AND
        t2.id IS NOT NULL
  )
ORDER BY t1.name 

实体类如下:


@Entity
@Table(name = "table1")
public class Table1 {

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer number;

    @ManyToOne
    @JoinColumn(name = "table2_id")
    private Table2 table2;

   // Getters and Setters
}

@Entity
@Table(name="table2")
public class Table2 {
    private  Integer id;
    private  Integer column1_number;

    @Override
    public Integer getId() {
        return id;
    }

    @Override
    public void setId(Integer id) {
        this.id = id;
    }

   // Getters and Setters
}

存储库是:


@Repository
public interface Table1Repository extends JpaRepository<Table1, Integer> {

    @Query(value = "SELECT name FROM table1 t1 WHERE t1.table2_id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = ?1 AND t2.id IS NOT NULL) ORDER BY t1.name", nativeQuery = true)
    List<Table1> findByNumberOrderByName(Integer number);
}

关于为什么我在运行时收到此错误的任何想法?编译时不会出现此错误。

【问题讨论】:

    标签: java spring spring-data-jpa mariadb nativequery


    【解决方案1】:

    您正在尝试使用 id 在 table2 中搜索,但您没有从 table1 中选择正确的映射列,应该是 table2_id.id ,所以查询应该是这样的

    SELECT name FROM table1 t1 WHERE t1.table2_id.id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = 1 AND t2.id IS NOT NULL) ORDER BY t1.name 
    
    

    另请注意您使用的是本机查询,这意味着直接查询数据库,因此请确保您在数据库表中使用相同的正确名称。

    【讨论】:

    • 我想做一个原生查询。例如,如果我没有参数并且在 JPQL 查询字符串值中使用 1 而不是 ?1 进行查询,为什么它仍然给出相同的错误消息?为什么在这种情况下id 列仍然没有给出这样的列?是纯原生的。我需要参考id 列的来源吗?
    • 当然,正如我提到的原生意思是直接查询数据库,所以数据库引擎必须清楚一切。
    • 我还注意到你期待 List ,这应该是 List
    • 谢谢;但是,我已经找到了答案。我有提交的答案在这里:stackoverflow.com/a/56088402/11003540 我已经解决了这个问题。
    【解决方案2】:

    尝试将 Id 元素添加到 table1 并使用 @Id 注释对两个表的 Id 字段进行注释,如下所示。

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    

    【讨论】:

      【解决方案3】:
      @Query(value = "SELECT name FROM table1 t1 WHERE t1.table2_id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = ?1 AND t2.id IS NOT NULL) ORDER BY t1.name", nativeQuery = true)
          List<Table1> findByNumberOrderByName(Integer number);
      

      应该是List&lt;String&gt; 而不是List&lt;Table1&gt;

      所以解决方案是:

      @Query(value = "SELECT name FROM table1 t1 WHERE t1.table2_id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = ?1 AND t2.id IS NOT NULL) ORDER BY t1.name", nativeQuery = true)
          List<String> findByNumberOrderByName(Integer number);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 2015-07-30
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多