Ошибка JPA Map <KEY, VALUE> по JPQL

Я храню карту в JPA, которая хранит перевод ключевых слов на каждом языке. такие как один объект хранитLocale.ENGLISH -> "Father" , Locale.CHINESE -> "PaPa", И еще один объект магазиныLocale.ENGLISH -> "Mother" , Locale.CHINESE -> "MaMa";

Вот мой рабочий дизайн:

public class Relation {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @ElementCollection
  @MapKeyColumn(name="locale")
  @Column(name="value")
  @CollectionTable(name = "RelationName", joinColumns = @JoinColumn(name = "relation_id"))
  private Map<Locale, String> langMap = new HashMap<>();

  // other fields skipped
}

Это хорошо работает, я могу хранить много переводов ключевых слов в БД. Но когда запрос с JPQL, у него есть некоторые проблемы:

Например, я хочу узнать, какое отношение имеет английский ключ со значением «Отец»:

Это мой код:

Relation r = em.createQuery("select r from Relation r join r.langMap m where ( KEY(m) = :locale and VALUE(m) = :value ) " , Relation.class)
  .setParameter("locale" , locale)
  .setParameter("value" , value)
  .getSingleResult();

Он генерирует этот странный / неработающий SQL:

Hibernate: 
    select
        relation0_.id as id1_18_
    from
        Relation relation0_ 
    inner join
        RelationName langmap1_ 
            on relation0_.id=langmap1_.relation_id 
    where
        langmap1_.locale=? 
        and (
            select
                langmap1_.value 
            from
                RelationName langmap1_ 
            where
                relation0_.id=langmap1_.relation_id
        )=?
00:16:12.038 WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1242, SQLState: 21000
00:16:12.038 ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Subquery returns more than 1 row

Я не знаю, почему он генерирует этот странный подзапрос.

Я могу решить эту проблему по критериям:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Relation> criteria = builder.createQuery(Relation.class);
Root<Relation> root = criteria.from(Relation.class);
criteria.select(root);
MapJoin<Relation , Locale , String> mapJoin = root.joinMap("langMap");
criteria.where(builder.and(
  builder.equal(mapJoin.key(), locale) ,
  builder.equal(mapJoin.value() , value))
);

return em.createQuery(criteria).getSingleResult();

Генерирует корректный SQL (where langmap1_.locale=? and langmap1_.value=? ) и работает хорошо.

Но я чувствую, что Критерии слишком сложны. И мне интересно, почему JPQL провалился? Как исправить JPQL?

Благодарю.

Конверт:

JPA2, Hibernate 4.2.3, MySQL диалект

Ответы на вопрос(3)

Ваш ответ на вопрос