小编典典

通过原型搜索Hibernate`Example`

sql

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


阅读 208

收藏
2021-04-14

共1个答案

小编典典

所以您要寻找 原型 吗?HibernateExample为此提供了一个方便的标准,因此,如果您不介意将自己与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();

它具体说:

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

这正是您似乎想要的。

2021-04-14