Это мой код, который я не могу даже скомпилировать:Что не так с моим кодом 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>
Что я делаю неправильно?
Но это то, что я взял из учебника (http://download.oracle.com/javaee/6/tutorial/doc/gjivm.html). Учебник ошибочен? – yegor256
@ Vincenzo: Удивительно, но урок неправильный. Авторы учебника путали динамическую метамодель (полученную через 'getMetamodel()') со статической метамодели (сгенерированной инструментами обработки). Для доступа к таким свойствам, как 'Employee_.project', может использоваться только статическая метамодель. Кстати, вы также ошибаетесь: запрос такого типа потребует «RIGHT JOIN» в JPQL, но API Критерии не поддерживает правильные объединения. Вы можете переписать его с подзапросом и «НЕ СУЩЕСТВУЕТ». – axtavt