Кортеж на самом деле не более безопасен, чем массив, не так ли?
То, что вы могли бы здесь сделать, это использовать выражение конструктора. С моей головы это что-то вроде:
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();
Для этого требуется написать новый класс для хранения результата, но обычно это будет довольно тривиально.