如果我在 Spring 数据 JDBC 中使用没有 @Id 的实体 class,我是否遗漏了什么?

Am I missing something if I use my entity class without @Id in Spring Data JDBC?

我是 spring 的新手。

我刚刚尝试在 Spring 数据 JDBC

中使用没有 @Id 的实体 class 成功

在我的存储库中添加了自定义查询,用于从 2 mysql table 中检索数据并返回具有连接的 table 数据的实体。

如果我打算只使用自定义查询,我是否遗漏了什么?

这是我的实体 class,没有 @Id 或 @Entity:

public class Item 
{
private long id;
private String code;
private String itemName;
private String groupName;

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public String getCode() {
    return code;
}
public void setCode(String code) {
    this.code = code;
}
public String getItemName() {
    return itemName;
}
public void setItemName(String itemName) {
    this.itemName = itemName;
}
public String getGroupName() {
    return groupName;
}
public void setGroupName(String groupName) {
    this.groupName = groupName;
}
}

存储库层:

@Repository 
public interface ItemRepository extends PagingAndSortingRepository<Item, Long> 
{ 
 @Query("SELECT a.id, a.code, a.name AS item_name, 
 b.name as group_name from item a, item_group b 
 WHERE a.group_id = b.id AND a.id=:id")
Item findItemById(@Param("id") Long id);
}

服务层:

@Service
public class ItemServiceImpl implements ItemService 
{   
    private final ItemRepository itemRepository;
    
    public ItemServiceImpl(ItemRepository itemRepository) 
    {
        this.itemRepository = itemRepository;
    }
    
    @Override
    @Transactional(readOnly=true)
    public Item findItemById(Long id) 
    {
        return itemRepository.findItemById(id);
    }
}

我更新了主配置 class 以响应 Jens 的回答:

@SpringBootApplication
@EnableJdbcRepositories
public class SpringDataJdbcApplication extends AbstractJdbcConfiguration
{
    public static void main(String[] args) 
    {
        SpringApplication.run(SpringDataJdbcApplication.class, args);
    }
    
    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource() 
    {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        return dataSourceBuilder.build();
    }
    
    @Bean
    NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) 
    { 
        return new NamedParameterJdbcTemplate(dataSource);
    }

    @Bean
    PlatformTransactionManager transactionManager() 
    { 
        return new DataSourceTransactionManager(dataSource());
    }
}

如果您没有遇到任何异常,您应该没问题。 Spring 数据 JDBC 中不应该有任何在未指定 id 时静默中断的内容。

但问题是:我不认为这是一个有效的功能,而只是偶然的行为。这意味着它可能会破坏任何版本,尽管用基于 NamedParameterJdbcTemplate 的自定义实现替换这些方法应该不会太难,因此风险有限。

但问题是:你为什么不添加 @Id 注释,毕竟你的实体确实有一个 ID。存储库的整个概念在概念上需要一个 id。

如果它工作正常并且您真的不想使用注释,则可以这样做。但我认为这是不必要的并发症。如果您使用了注释,您可以预料到不会出现的错误,并且代码将更难调试。如果您是 Spring 的新手,我建议您使用注释。但毕竟这取决于您将如何设计您的应用程序。当然,没有注释的方法的优势是对数据库的更好控制。