2010-10-04 1 views
1

Это мой код, который я не могу даже скомпилировать:Что не так с моим кодом API-правил JPA (взято из учебника JEE6)?

/** 
* Find a project that has NO employee assigned yet. 
*/ 
public Project findEmptyProject() { 
    // getting criteria builder 
    CriteriaBuilder cb = this.em.getCriteriaBuilder(); 
    // gathering meta information about left-joined entity 
    Metamodel m = this.em.getMetamodel(); 
    EntityType<Employee> Employee_ = m.entity(Employee.class); 
    // creating query 
    CriteriaQuery<Project> cq = cb.createQuery(Project.class); 
    // setting query root for the query 
    Root<Project> project = cq.from(Project.class); 
    // left-joining with another employees 
    Join<Employee, Project> projects = project.join(
    Employee_.project, 
    JoinType.LEFT 
); 
    // instructing the query to select only projects 
    // where we have NO employees 
    cq.select(project).where(Employee_.id.isNull()); 
    // fetching real data from the database 
    return this.em.createQuery(cq).getSingleResult(); 
} 

Моя модель классов:

public class Employee { 
    @Id private Integer id; 
    @ManyToOne private Project project; 
    private String name; 
} 

public class Project { 
    @Id private Integer id; 
    private String name; 
} 

Компилятор говорит (и я бы сказал то же самое время компилятор):

Finder.java: cannot find symbol: variable project 
location: interface javax.persistence.metamodel.EntityType<com.XXX.Employee> 

Что я делаю неправильно?

ответ

3

При использовании Employee_.project синтаксиса, Employee_ должен быть автоматически генерируемая метамодель классом, не EntityType полученных с помощью Metamodel.entity().

Hibernate JPA 2 Metamodel Generator manual объясняет, как настроить генерацию этих классов в спящем режиме.

+0

Но это то, что я взял из учебника (http://download.oracle.com/javaee/6/tutorial/doc/gjivm.html). Учебник ошибочен? – yegor256

+2

@ Vincenzo: Удивительно, но урок неправильный. Авторы учебника путали динамическую метамодель (полученную через 'getMetamodel()') со статической метамодели (сгенерированной инструментами обработки). Для доступа к таким свойствам, как 'Employee_.project', может использоваться только статическая метамодель. Кстати, вы также ошибаетесь: запрос такого типа потребует «RIGHT JOIN» в JPQL, но API Критерии не поддерживает правильные объединения. Вы можете переписать его с подзапросом и «НЕ СУЩЕСТВУЕТ». – axtavt

Смежные вопросы