Поиск спящих объектов по прототипу

1

У меня есть класс сущности JPA следующим образом:

@Entity
@Table(name = "person")
public class Person {
   @Id
   private Long id;
   private String lastName;
   private String firstName;
   private String country;
   private String gender; 
...
//setters and getters are omitted
}

Мне нужен метод поиска, как этот List<Person> findAll(Person searchCriteria)

Пример использования:

Person criteria1 = new Person();
criteria1.setFristName("John");
criteria1.setCountry("Usa");

//returns all John from Usa with any lastName
List<Person> searchingResult = findAll(criteria1);

Person criteria2 = new Person();
criteria2.setGender("m");
criteria2.setCountry("Holland");

//returns all man from Holland
List<Person> anotherSearchingResult = findAll(criteria2);

Моя идея метода findAll

String query = "select * from person where ";
if(criteria.getLastName() != null) query+= "last_name = "+ criteria.getLastName();
if(criteria.getGender() != null) query+= "gender = "+ criteria.getGender();
etc
List<Person> = session.execute(query);

Но это так уродливо и выглядит как накладные расходы. Может ли кто-нибудь помочь мне пригласить этот метод findAll более красиво? Я могу использовать любую java-технологию или фреймворк.

Теги:
hibernate
jpa

2 ответа

3
Лучший ответ

Итак, вы ищете прототип? Hibernate имеет удобный Example для этого только для этого, поэтому, если вы не против привязываться к API Hibernate, попробуйте этот пример из документов:

Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .list();

В нем конкретно говорится:

Свойства версии, идентификаторы и ассоциации игнорируются. По умолчанию исключаемые свойства исключаются.

Это именно то, что вам кажется нужным.

  • 0
    Спасибо. Это именно то, что я ищу.
0

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

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.or(
        Restrictions.eq( "age", new Integer(0) ),
        Restrictions.isNull("age")
    ) )
    .list();

Ограничения относятся к аннотированным переменным в классе. Взгляните на документацию.

  • 0
    Я думаю, что точка зрения ОП заключалась в том, что у него много свойств, из которых установлены только некоторые (и, следовательно, они необходимы для запроса). Добавление их вручную - большая работа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню