Sono riuscito a risolvere il problema da solo:
In primo luogo, ho creato entità:
Prodotto (id, nome, prezzo, descrizione)
Lingua (id, lang)
Product_t (id, prod_id, lang_id, name, description)
poi ho creato la funzione sul database:
FUNCTION 'getLangOrder'(language INTEGER, locale varchar(5)) RETURNS int(11)
BEGIN
case language
when (select id from language where lang=locale) then return 1;
when 2 then return 2;
when 1 then return 3;
else return 4;
end case;
RETURN 5;
END
Questa funzione ordina le mie traduzioni prima specificando le impostazioni locali specificate (se il valore predefinito è zero) e se ciò non è presente nell'ordine definito (inglese (2), sloveno (1), tedesco (3))
Poi nel mio repository invece di usare la funzione predefinita findAll () di JPA ho definito la mia query:
select p.id
, ifnull((select t.description
from product_t t where t.prod_id = p.id
order by getLangOrder(lang_id, @lang) limit 1)
, p.description
) as description
, ifnull((select t.name
from product_t t where t.prod_id = p.proj_id
order by getLangOrder(lang_id, @lang) limit 1)
, p.name
) as name
, p.price
from product p
dove @lang è il mio argomento passato (locale letto dal cookie)
Che poi ha creato un elenco con entità Prodotto, dove il nome e la descrizione sono stati tradotti.