Java 在Spring数据JDBC中使用带@Id注释的复合实体有什么影响?

Java 在Spring数据JDBC中使用带@Id注释的复合实体有什么影响?,java,spring-data,spring-data-jdbc,Java,Spring Data,Spring Data Jdbc,我的SpringDataJDBC项目中有一个复合实体类,如下所示,它可以映射到表项 虽然字段id、code和itemName来自表item,但字段groupName属于另一个表item\u group 我使用存储库中的自定义查询成功加载了此实体对象,如下所示: "SELECT a.id, a.code, a.name AS item_name, b.name as group_name from item a LEFT JOIN item_group b ON a.group_id =

我的SpringDataJDBC项目中有一个复合实体类,如下所示,它可以映射到表项

虽然字段id、code和itemName来自表item,但字段groupName属于另一个表item\u group

我使用存储库中的自定义查询成功加载了此实体对象,如下所示:

"SELECT a.id, a.code, a.name AS item_name, b.name as group_name from item a LEFT JOIN item_group b ON a.group_id = b.id where a.id=:id")
像这样使用@Id注释的复合类有什么影响吗

public class Item 
{
    @Id
    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;
    }

乍一看,这看起来确实不对劲

您将无法加载,更不用说使用标准CRUD方法保存它了

它看起来也是错误的,因为它看起来像是在合并两个聚合:Item和Group,这两个聚合实际上应该是独立的聚合,它们之间没有Java引用。看

但是如果你认为它是专门的语境的话,它确实是有意义的。 如果您只需要从数据库中读取它,那么这是一种非常有效的方法。它简单高效,因为它在一个select中加载所有必需的数据

假设您正处于这种情况,我建议您:

在数据库中为联接创建视图。否则,联接将在每个查询中重复一次又一次。 如果您有这样一个视图,您实际上可以删除@Query注释,只需使用标准的find。。。方法。 不要让您的存储库扩展crudepository,而只是手动添加您实际需要的方法。这避免了混淆,并且很明显,此存储库和实体只能用于读取。 如果您使用标准查找。。。方法必须具有正确注释的id属性。如果你不使用查找。。。方法时,@Id注释是多余的。
乍一看,这看起来确实不对劲

您将无法加载,更不用说使用标准CRUD方法保存它了

它看起来也是错误的,因为它看起来像是在合并两个聚合:Item和Group,这两个聚合实际上应该是独立的聚合,它们之间没有Java引用。看

但是如果你认为它是专门的语境的话,它确实是有意义的。 如果您只需要从数据库中读取它,那么这是一种非常有效的方法。它简单高效,因为它在一个select中加载所有必需的数据

假设您正处于这种情况,我建议您:

在数据库中为联接创建视图。否则,联接将在每个查询中重复一次又一次。 如果您有这样一个视图,您实际上可以删除@Query注释,只需使用标准的find。。。方法。 不要让您的存储库扩展crudepository,而只是手动添加您实际需要的方法。这避免了混淆,并且很明显,此存储库和实体只能用于读取。 如果您使用标准查找。。。方法必须具有正确注释的id属性。如果你不使用查找。。。方法时,@Id注释是多余的。
我认为这是非常糟糕的做法。最好有一个ItemGroup实体。实际上,我的要求是使用“Item”实体从“Item”表中捕获所有细节。由于“item”表只有组id,所以我必须加入“item\u group”表以获取组的名称。在上面的查询中,我只在'Item'entity.magicmn中加载组名,我在问题中对表中字段的分布进行了更正。我认为这是非常糟糕的做法。最好有一个ItemGroup实体。实际上,我的要求是使用“Item”实体从“Item”表中捕获所有细节。由于“item”表只有组id,所以我必须加入“item\u group”表以获取组的名称。在上面的查询中,我只在'Item'entity.magicmn中加载组名,我在关于表中字段分布的问题中做了一个更正。非常感谢Jens。注意到你的建议。非常感谢Jens。注意你的建议。