我有这样的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)
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技术或框架。
findAll
所以您要寻找 原型 吗?HibernateExample为此提供了一个方便的标准,因此,如果您不介意将自己与Hibernate API捆绑在一起,请尝试以下来自docs的示例:
Example
Cat cat = new Cat(); cat.setSex('F'); cat.setColor(Color.BLACK); List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .list();
它具体说:
版本属性,标识符和关联将被忽略。默认情况下,排除空值属性。
这正是您似乎想要的。