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