No sé qué es JPA (puedo buscarlo en Google; lo que quiero decir es que no estoy familiarizado con él); pero:si hay alguna esperanza de manejar una consulta SQL, y el único problema es traducir una condición en tuplas, reescriba la consulta así:
select city
from user
where firstname = 'a' and lastname = 'b'
or firstname = 'c' and lastname = 'd'
;
Esto es lo que hará el motor de consultas con su consulta original independientemente; puedes mirar un PLAN DE EXPLICACIÓN para convencerte de esto.
A algunas personas les gusta poner paréntesis alrededor de cada par de AND
-condiciones conectadas; Yo no, así como tampoco usaría paréntesis para 2 * 3 + 4 * 6, pero si sientes que agregan claridad, por supuesto que puedes agregarlos.