java - 使用 JPA 选择元组的好方法

标签 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();

这会产生错误“无法为具有多个返回值的查询创建 TypedQuery”。我可以通过省略类型参数(并使用 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();

但是有没有不需要未检查代码的解决方案呢?

最佳答案

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

您在这里可以做的是使用构造函数表达式。在我的脑海中,这是这样的:

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();

这需要您编写一个新类来保存结果,但这通常非常简单。

关于java - 使用 JPA 选择元组的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668183/

相关文章:

java - gwt 使用jquery 效果可能吗?

Java:更改二进制数(如 1010)并反转位。 1010 = 0101。0's to 1' 和 1's to 0'

c# - 有没有办法在 C# 中为泛型类型的特定版本定义隐式转换运算符?

c# - 如何在静态泛型方法中设置 T 的默认类型?

java - 访问不同类中的 JTextField 并将其添加到字符串中

java - 如何将输出显示为 00001 而不是 1。当它达到 10 时,它应该是 00010 而不是 10 或 000010

java - Spring-Hibernate,多对多关系查询

java - Spring/Hibernate : spring.实体。下载无法转换为java.lang.Integer

java - 使用连接和类似运算符的 Hibernate 查询

两个协变接口(interface)的 C# 协变问题