如何在 Spring 数据 JDBC 中的 CrudRepository 查询中引用实体?

How to reference entity in Query in CrudRepository in Spring Data JDBC?

我想使用 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]

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

这是任务实体的样子:

@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,
);

也许这会对你有所帮助, COLUMN_NOT_FOUND_1 = 42122 引用不存在的列时会抛出代码为 42122 的错误。 例子: 创建 TABLE 测试(ID INT); SELECT 来自测试的名称;

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

interface TasksCrudRepository extends CrudRepository<Task, Long> {


    List<Task> findByTitleNotNull();
}

修改完成:

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

解决方案是使用 @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();