Задать вопрос
@fro-do

Spring. Как получить сущность с определённым значением поля?

Всем привет!
У меня есть Дома (House), у которых есть куча других дочерних сущностей, в том числе - Документы (Doc). Проблема в том, что есть документы нескольких разных типов. Сейчас я хочу работать только с одним конкретным, но в будущем мне понадобятся и другие.
В БД уже есть данные по другим типам и, естественно, форма падает при попытке её открыть - ведь возвращается больше 1 результата. Переделал связь на ManyToOne, в House сделал List вместо единственного значения.

Но не пойму, в каком месте и как отделить ненужные. Сейчас код выглядит так:

HOUSE
@Data
@Entity
@Table(schema = "public", name = "House")
public class House implements Serializable {

    @Column(name = "House_ID")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

// всякие другие поля дома и другие дочерние сущности

    @OneToMany(mappedBy = "house", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private List<HouseDoc> houseDocs;


HouseDoc
@Entity
@Table(name = "House_Doc", schema = "public")
@Data
public class HouseDoc implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Pkey_id")
    private Integer id;

    @Column(name = "Doc_type")
    private int docType;

// всякие другие поля документов

   @ManyToOne
    @JoinColumn(name = "House_ID", referencedColumnName = "House_ID")
    protected House house;
}


dto House
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HouseFullProjection extends HouseProjection {
	private List<HouseDoc> houseDocs;


dto HouseDoc
@Data
public class HouseDocProjection implements Serializable {
    private Integer id;
    protected int docType;
}


Контроллер: пытаюсь отдать всё в интерфейс
@RequestMapping(value = "/houses/edit/{id}")
    public ModelAndView editCard(@PathVariable("id") Integer id) {
        House house = service.getHouse(id);
        house.getWindowOptions(); // это всякие другие дочерние сущности, с ними всё ок
        <b>house.getHouseDocs();</b> // вот тут мне нужен 1 документ, а не пачка
        return editCard(house);
    }


Подскажите пожалуйста, куда правильно будет вставить условие: нужны только документы, у которых docType = 1.
  • Вопрос задан
  • 461 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Здравствуйте!
Почему бы вам не использовать возможности jpql (jpa)?
Я не вижу всего вашего кода, в частности @Service & @Repository
Примерно, вам нужно сделать что-то подобное...
В репозиторий добавить
@Query(SELECT House h FROM ... WHERE h.housId = ?1 AND h.housedoc.docType = ?2)
House findHouseByIdAndHouseDocByDocType(Long houseId, int docType)

тут конечно надо подправить... но в целом, примерно как-то так
А в service реализовать метод, который в качестве аргументов принимает Long & int и возвращает сущность House.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы