【问题标题】:JPA Typed Search QueriesJPA 类型化搜索查询
【发布时间】:2010-10-26 09:22:22
【问题描述】:

我有一个相当大的模特申请人:

public class Applicant{
 private Long id
 private String name;
 ...
 ...
}

要填充选择列表,我需要一个 (id, name) 元组列表,我使用以下搜索查询:

public List getNames() {
    Query query = em.createQuery("select a.id, a.name from Applicant a");
    return query.getResultList();

}

但是,我得到了一个 Object[] 的列表,我真的不想在业务层中将它们转换为相应的类型(Long 和 String)。解决这个问题的最佳方法是什么?我应该遍历列表并在返回之前手动进行类型转换吗?或者我应该创建一个辅助类:

public class ApplicantTuple{
 public Long id
 public String name;

 public Application(Long id, String name) {
    ...
 }

}

然后有一个搜索查询:

Query query = em.createQuery("select NEW my.model.ApplicantTuple(a.id, a.name) from Applicant a");

或者有没有更好的方法来输入搜索查询?

【问题讨论】:

    标签: java jpa type-conversion jpa-2.0 jpql


    【解决方案1】:

    由于您显然使用的是 JPA2,因此请使用类型安全的方法:

    public List<Applicant> getApplicants() {
        TypedQuery<Applicant> query = em.createQuery(
            "select a.id, a.name from Applicant a",
            Applicant.class
        );
        return query.getResultList();
    }
    

    然后只使用对象:

    for(Applicant app: getApplicants()){
        selectionList.populate(app.getName(), app.getId());
    }
    

    【讨论】:

    • 申请人对象的其他字段会发生什么情况?他们不被取走?当我使用联接和查询来自两个表/实体的字段时,这可能吗?
    • 是的,确实会获取其他字段,除非它们被配置为惰性。
    • 但是,这会使结果集变得不必要地庞大,不是吗?
    • 如果您在关系数据库之上使用面向对象的方法,这就是权衡。在 ORM 中,您正在处理对象(因此您有开销)。这就是你必须为类型安全和易于编程付出的代价。如果你不想付出这个代价,就使用 JDBC 或 IBatis。
    • 另一个注意事项:如果Applicant 很大,请尝试将其中一些不常用的数据移动到关联的类/表中,例如让它有一个Address 字段和一个@OneToOne 关系,该关系被定义为惰性等。巨大的类是另一个表明你没有采用面向对象的方式,因此使用普通的JDBC(或构建一个真正的对象层次结构)可能会更好)。
    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多