java - 如何在 Spring boot 中检查嵌套对象来获取对象?

标签 java mysql spring spring-boot

我无法使用 JpaRepository 获得我想要的东西。我将尝试使用以下代码来解释我想要的内容:

存储库

 @Repository
public interface CompanyRepository extends JpaRepository<Company, Long> {

    Optional<Company> findByIdAndBranches_parent_idIsNull(Long id);
}

服务

@Service
public class BillService {

@Autowired
private CompanyRepository companyRepository;

@Autowired
private BranchRepository branchRepository;

public Company getCompanyById(Long id)
{
    Optional<Company> company = companyRepository.findByIdAndBranches_parent_idIsNull(id);
    return company.get();
}

公司实体类

public class Company 
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

private String address;

@OneToMany(mappedBy = "company")
private List<Branch> branches;

@OneToMany(mappedBy = "company")
private List<User> users;

}

分支实体类

@Entity
public class Branch 
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

private String address;

@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
private Company company;

@JsonIgnore
@ManyToOne(cascade = CascadeType.ALL )
@JoinColumn(name = "parent_id")
@NotFound(action = NotFoundAction.IGNORE)
private Branch parent;

@OneToMany(mappedBy = "parent")
@NotFound(action = NotFoundAction.IGNORE)
private List<Branch> subBranches;

@OneToMany(mappedBy = "branch")
private List<User> users;

}

现在我想要的是公司的分支机构的父 ID 为 NULL,但无论父 ID 为何,我都会获取所有分支机构

这就是我想要的结果

{
"id": 1,
"name": "Lakshya",
"address": "Bahadurgarh",
"branches": [
    {
        "id": 1,
        "name": "Lakshya Branch1",
        "address": "Bahadurgarh1",
        "subBranches": [
            {
                "id": 3,
                "name": "Lakshya Branch1_3",
                "address": "Bahadurgarh1_3",
                "subBranches": [],
                "users": []
            }
        ],
        "users": [
            {
                "id": 3,
                "name": "User3_Company1_Branch1",
                "address": "Bgz"
            }
        ]
    }
],
"users": [
    {
        "id": 1,
        "name": "User_Company1",
        "address": "Bgz"
    },
    {
        "id": 2,
        "name": "User_Company1_Branch1",
        "address": "Bgz"
    },
    {
        "id": 3,
        "name": "User3_Company1_Branch1",
        "address": "Bgz"
    }
]
}

但这就是我得到的

{
"id": 1,
"name": "Lakshya",
"address": "Bahadurgarh",
"branches": [
    {
        "id": 1,
        "name": "Lakshya Branch1",
        "address": "Bahadurgarh1",
        "subBranches": [
            {
                "id": 3,
                "name": "Lakshya Branch1_3",
                "address": "Bahadurgarh1_3",
                "subBranches": [],
                "users": []
            }
        ],
        "users": [
            {
                "id": 3,
                "name": "User3_Company1_Branch1",
                "address": "Bgz"
            }
        ]
    },
    {
        "id": 3,
        "name": "Lakshya Branch1_3",
        "address": "Bahadurgarh1_3",
        "subBranches": [],
        "users": []
    }
],
"users": [
    {
        "id": 1,
        "name": "User_Company1",
        "address": "Bgz"
    },
    {
        "id": 2,
        "name": "User_Company1_Branch1",
        "address": "Bgz"
    },
    {
        "id": 3,
        "name": "User3_Company1_Branch1",
        "address": "Bgz"
    }
]

}

最佳答案

如果需要过滤掉关联实体,可以使用@Where 。它不是 JPA 规范的一部分,但 Hibernate 的 JPA 实现提供了此注释。因此您可以指定任何附加条件:

public class Company 
{
    ...

    @OneToMany(mappedBy = "company")
    @Where(clause = "parent_id is null")
    private List<Branch> branches;

    @OneToMany(mappedBy = "company")
    private List<User> users;
}

然后您必须更改存储库的方法名称,因为您不再需要额外的条件:

@Repository
public interface CompanyRepository extends JpaRepository<Company, Long> {
    Optional<Company> findById(Long id);
}

使用这种方法,您总是会得到只有分支机构而没有母公司的公司。如果您需要获取公司的所有分支机构(无论它们是否有父级),您可以为 Branch 实体类创建和使用存储库。

关于java - 如何在 Spring boot 中检查嵌套对象来获取对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56856775/

相关文章:

java - 模数师

java - 删除与另一个实体映射的实体

java - 使用 Selenium 项目执行 Squash TA 时出错 IllegalArgumentException : URI has an authority component

java - 如何使用 xml 配置构建以下 bean?

java - 如何为 Spring Batch 应用响应式(Reactive)

java - 如何在 ruby​​ 中将 java.util.Date 格式化为 "MM/dd/yyyy"格式的日期?

php - mysql与php在表中添加一行

mysql - 特定字段更新时的时间戳

mysql - 出现错误 - 无法添加或更新子行 : a foreign key constraint fails for a legacy database in django

css - 在 CSS 文件中使用 JSP 或 Spring 标签