【问题标题】:Search hibernate entities by prototype按原型搜索休眠实体
【发布时间】:2014-04-01 15:18:47
【问题描述】:

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

【问题讨论】:

    标签: java sql hibernate jpa


    【解决方案1】:

    所以您正在寻找一个原型? 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();
    

    具体说:

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

    这正是你想要的。

    【讨论】:

    • 谢谢。这正是我正在寻找的。​​span>
    【解决方案2】:

    您应该查看 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

    【讨论】:

    • 我认为 OP 的观点是他有很多属性,其中只有一些被设置(因此查询需要)。手动添加它们需要大量工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多