使用JPA选择元组的好方法

时间:2011-12-29 12:59:26

标签: java hibernate generics jpa jpql

final List<Tuple> data =
                    em.createQuery("SELECT p.id AS i, p.membership AS m FROM Player p WHERE p.id IN :ids", Tuple.class)
                    .setParameter("ids", ids)
                    .getResultList();

这会产生错误“Cannot create TypedQuery for query with more than one return”。我可以通过省略type参数(并使用Object []而不是Tuple来解决这个问题,我后来发现):

@SuppressWarnings("unchecked")
final List<Object[]> data =
                    em.createQuery("SELECT p.id AS i, p.membership AS m FROM Player p WHERE p.id IN :ids")
                    .setParameter("ids", ids)
                    .getResultList();

但是,是否有一个不需要未经检查的代码的解决方案?

2 个答案:

答案 0 :(得分:11)

元组实际上并不比数组更安全,是吗?

这里你可以做的是使用构造函数表达式。在我的头顶,这就像是:

class PlayerMembership {
    public final int id;
    public final MembershipType membership;
    public PlayerMembership(int id, MembershipType membership) {
        this.id = id;
        this.membership = membership;
    }
}

List<PlayerMembership> data =
                    em.createQuery("SELECT NEW nl.bart.PlayerMembership(p.id, p.membership) FROM Player p WHERE p.id IN :ids", PlayerMembership.class)
                    .setParameter("ids", ids)
                    .getResultList();

这要求你编写一个新类来保存结果,但这通常是非常简单的。

答案 1 :(得分:4)

我不这么认为,除了使用标准API。

但实际上,代码的类型安全性和正确性更多地取决于传递给createQuery的查询而不是查询返回的列表类型。而且,无论如何,你必须抛出数组的每个元素。

SuppressWarnings注释是我最不关心的事情。唯一真正使代码类型安全的是执行查询的自动化测试和消耗结果的代码。