Как я могу получить объект с проверками вложенного объекта при загрузке Spring? - PullRequest
0 голосов
/ 02 июля 2019

Я не могу получить то, что собираюсь, используя 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;

}

Теперь я хочу получить компанию с филиалами, имеющими родительский идентификатор NULL, но получающими все ветви независимо от родительского идентификатора

Это то, что я хочу в результате

{
"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"
    }
]

}

1 Ответ

1 голос
/ 02 июля 2019

Если вам нужно отфильтровать связанные объекты, вы можете использовать @ Где .Это не часть спецификации JPA, но реализация JPA от Hibernate предоставляет эту аннотацию.Таким образом, вы можете указать любые дополнительные условия:

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 класса сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...