按原型搜索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();
限制是指类中带注释的变量。 看一下文档 。