【问题标题】:How to reference entity in Query in CrudRepository in Spring Data JDBC?如何在 Spring Data JDBC 的 CrudRepository 中的查询中引用实体?
【发布时间】:2019-10-21 07:18:17
【问题描述】:

我想使用 Spring Data CrudRepository 使用 findWithTitle() 方法从数据库中获取实体,如下所示:

interface TasksCrudRepository extends CrudRepository<Task, Long> {

    @Query(value = "SELECT t FROM Task t WHERE t.title IS NOT NULL")
    List<Task> findWithTitle();
}

但我明白了

org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "T" not found; SQL statement:
SELECT t FROM Task t [42122-199]

我找不到发生这种情况的原因。据我所知,这种语法应该按预期工作。

这是 Task 实体的样子:

@Data
@Table("task")
@AllArgsConstructor
public class Task {
    @Id
    private Long id;
    private String title;
    private String description;
    private Set<Attachment> attachments;
    private Set<TagRef> tagRefs;
    @CreatedDate
    private LocalDateTime createdAt;
    @LastModifiedDate
    private LocalDateTime updatedAt;
}

这是它的架构:

CREATE TABLE task
(
    id          IDENTITY,
    title       VARCHAR(100),
    description VARCHAR(1024),
    created_at  TIMESTAMP,
    updated_at  TIMESTAMP,
);

【问题讨论】:

  • 也许可以尝试使用SELECT (t) 而不是SELECT t
  • "SELECT t FROM Task t ..."... 我认为,如果您在表Task 中有一个列t,那么"SELECT t.t FROM Task t..." 就可以了。顺便说一句,我不会创建与列具有相同名称的表别名。错误消息指出没有列T(大写,为什么?),所以检查是否有。
  • @menteith 没有帮助。
  • @deHaar - 没有这样的专栏。我已经为 Task 添加了架构/实体。
  • 你是不是错过了@Entity注解?

标签: java spring spring-data spring-jdbc


【解决方案1】:

使用预定义的 Spring JPA 方法代替自定义查询。
请尝试以下方法。

interface TasksCrudRepository extends CrudRepository<Task, Long> {


    List<Task> findByTitleNotNull();
}

修改完成:

  • 删除了查询烦恼
  • 重命名方法以匹配 JPA 标准预定义服务

【讨论】:

【解决方案2】:

解决方案是使用@deHaar 提到的星号:

@Query("SELECT * FROM Task t ...")
List<Task> findTasks();
}

更重要的是,如果您想执行 JOIN 查询,也可以使用星号运行:

@Query("SELECT * FROM Task t JOIN Attachment a ON t.id = a.task")
List<Task> findWithAttachments();

【讨论】:

    【解决方案3】:

    也许这会对你有所帮助, COLUMN_NOT_FOUND_1 = 42122 引用不存在的列时会引发代码 42122 的错误。 例子: 创建表测试(ID INT); 从测试中选择名称;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2017-01-06
      • 2020-03-16
      相关资源
      最近更新 更多