Хороший способ выбрать кортеж с помощью JPA - PullRequest
6 голосов
/ 29 декабря 2011
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".Я мог бы обойти это, оставив параметр типа (и используя 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 ]

11 голосов
/ 04 октября 2012

Кортеж на самом деле не более безопасен, чем массив, не так ли?

То, что вы могли бы здесь сделать, это использовать выражение конструктора. С моей головы это что-то вроде:

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

Для этого требуется написать новый класс для хранения результата, но обычно это будет довольно тривиально.

4 голосов
/ 29 декабря 2011

Я так не думаю, за исключением использования критериев API.

Но на самом деле безопасность типов и правильность кода зависят в большей степени от запроса, переданного в createQuery, чем от типа списка, возвращаемого запросом.Более того, вам все равно придется приводить каждый элемент массива.

Аннотация SuppressWarnings - последнее, о чем я бы хотел позаботиться.Единственное, что действительно сделает код безопасным по типу, - это автоматический тест, который выполняет запрос, и код, который потребляет результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...