Могу ли я ссылаться на первичный ключ любого объекта в JPQL по имени «id», независимо от имени свойства ID объекта? - PullRequest
2 голосов
/ 21 июня 2010

Hibernate позволяет вам просто сказать ".id". Допустим, у меня есть:

@Entity public class Customer {
  @Id private Integer customerId;
  @Basic private String customerName;
  // getters and setters
}

И я хочу получить имя клиента по ID:

SELECT cust.customerName FROM Customer cust WHERE cust.id = :customerId

Обратите внимание, что я поставил «id» вместо «customerId» как ярлык Это допустимый JPQL или только в Hibernate?

1 Ответ

2 голосов
/ 21 июня 2010

Спецификация JPA не определяет такой ярлык, доступ к полям состояния (включая свойство Id) осуществляется по имени:

4.3 Абстрактные типы схем и домены запросов

(...)

Неформально тип абстрактной схемы сущности можно охарактеризовать следующим образом:

  • Для каждого постоянного поля или метода доступа get (для постоянного свойства) класса сущности, существует поле («состояние-поле»), тип абстрактной схемы которого соответствует типу поля или типу результата метода метода доступа.
  • Для каждого постоянного поля отношения или метода доступа getВ методе (для постоянного свойства отношения) класса сущности существует поле («ассоциативное поле»), тип которого является типом абстрактной схемы связанного объекта (или, если это отношение один ко многим или много-to-many, коллекция таких).

(...)

Другими словами, это специфично для Hibernate (см. раздел 14.5.обращатьсявызов идентификатора свойства ), поэтому не надейтесь на это, если хотите написать JPQL.


Вот что вы получите, например, с EclipseLink (MyEntity не имеет поля id):

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Error compiling the query [select e from MyEntity e where e.id = :id], line 1, column 33: unknown state or association field [id] of class [com.acme.MyEntity].
...