JPA использует хранилище findBy с объектом-сущностью - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь создать приложение с загрузочной пружиной и хочу настроить функцию исследования.

Что я сделал на данный момент:

У меня есть два класса, Персона. java и Хаус. java с OneToOne отношениями между этими двумя классами. Я хотел бы создать исследовательскую функцию, которая позволит мне находить человека в зависимости от свойств дома. Например, найти всех людей, у которых есть дома с почтовым индексом "45000" и городом "ORLEANS". Для этого я объявил функцию в своем репозитории findByHouseZipcodeAndCity.

Теперь проблема в том, что у моего объекта Дома около 15 свойств, и я хочу провести исследования с любым из этих 15 свойств: только почтовый индекс , почтовый индекс и город, город и поверхность ... что делает много комбинаций, и я не хочу создавать findBy методы для каждой комбинации.

Я пытался дать в качестве параметра my findBy объект House, который будет содержать критерии поиска. Это не работает, поскольку Hibernate выдает мне эту ошибку: object references an unsaved transient instance - save the transient instance before flushing. Проблема в том, что я создаю экземпляр Дома, я заполняю его критериями поиска и использую его для своего findBy, но я обнаружил, что findBy создает flush(), в то время как сущность Дома не сохраняется (И Я не хочу, чтобы это было сохранено, так как это только для поиска).

Я нашел такие решения, как использование критериев JPA, но я хотел бы знать, могу ли я выполнить свой поиск, просто используя сущность в качестве параметра для метода findBy.

Спасибо заранее за вашу помощь

PersonRepository. java

@Repository
public interface PersonRepository extends JpaRepository<Person, Long>{
    List<Person> findByHouseZipcodeAndHouseCity(String zipcode, String city);
    List<Person> findByHouse(House house);
}

Person. java

@Entity
public class Person{

    @Id
    @SequenceGenerator(name = "INFO_ACTION_SEQ", sequenceName = "INFO_ACTION_SEQ")
    @GeneratedValue(generator = "INFO_ACTION_SEQ", strategy = GenerationType.AUTO)
    @Column(name = "ID_PERSON", columnDefinition = "INTEGER")
    private Integer id;

    private String name;

    private String surname;

    @OneToOne(cascade = CascadeType.ALL)
    private House house;

}

Дом. java

@Entity
public class House{

    @Id
    @SequenceGenerator(name = "INFO_ACTION_SEQ", sequenceName = "INFO_ACTION_SEQ")
    @GeneratedValue(generator = "INFO_ACTION_SEQ", strategy = GenerationType.AUTO)
    @Column(name = "ID_HOUSE", columnDefinition = "INTEGER")

    private Integer id;

    private String city;
    private String street:
    private String zipcode;
    private String country;
    // Other properties...
}

1 Ответ

2 голосов
/ 03 марта 2020

Вы можете использовать запрос на примере , удобный метод запросов, который позволяет создавать динамические c запросы и вообще не требует написания запросов.

Рассмотрим следующую сущность:

@Data
@Entity
public class Person {

    @Id
    private String id;
    private String firstname;
    private String lastname;
    private Address address;
}

Для поиска всех лиц с данным именем вы можете использовать:

Person person = new Person();
person.setFirstname("Dave");

Example<Person> example = Example.of(person);
Iterable<Person> searchResult = repository.findAll(example);

И, если вам нужно найти один человек, используйте:

Person searchResult = repository.findOne(example);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...