У меня есть класс сущности 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 имеет удобный 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();
В нем конкретно говорится:
Свойства версии, идентификаторы и ассоциации игнорируются. По умолчанию исключаемые свойства исключаются.
Это именно то, что вам кажется нужным.
Вы должны изучить критерии спящего режима. Вы можете устанавливать ограничения как таковые:
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.or(
Restrictions.eq( "age", new Integer(0) ),
Restrictions.isNull("age")
) )
.list();
Ограничения относятся к аннотированным переменным в классе. Взгляните на документацию.