按原型搜索hibernate实体

我有这样的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 findAll(Person searchCriteria)搜索方法

用法示例:

 Person criteria1 = new Person(); criteria1.setFristName("John"); criteria1.setCountry("Usa"); //returns all John from Usa with any lastName List searchingResult = findAll(criteria1); Person criteria2 = new Person(); criteria2.setGender("m"); criteria2.setCountry("Holland"); //returns all man from Holland List 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 = session.execute(query); 

但这太丑了,看起来有些开销。 任何人都可以帮助我更好地邀请findAll方法吗? 我可以使用任何Java技术或框架。

所以你在寻找原型 ? Hibernate有一个方便的Example标准,所以如果您不介意将自己绑定到Hibernate API,请从文档中尝试此示例:

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

它具体说:

版本属性,标识符和关联将被忽略。 默认情况下,排除空值属性。

这正是你想要的。

你应该研究一下Hibernate Criteria。 您可以这样堆叠限制:

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

限制是指类中带注释的变量。 看一下文档 。