按原型搜索hibernate实体

时间:2014-04-01 15:18:48

标签: java sql hibernate jpa

我有这样的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技术或框架。

2 个答案:

答案 0 :(得分:3)

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

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

具体说:

  

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

这正是你想要的。

答案 1 :(得分:0)

你应该研究一下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();

限制是指类中带注释的变量。看看documentation