Jåc*_*cob 3 hibernate jpa coalesce criteria-api jpa-2.0
如何使用coalesce 或case statement在JPA 2中使用CriteriaBuilder
对于许多已启动的记录,它们将为空,因此对于这些记录,employeeName将为null.我想显示System Generated如果employeeName对于那些在数据库表中initiateBy employee为null的项目为null.
我在实体中有以下关系
项目
@Entity
@Table(name = "PROJECT")
public class Project {
@Id
@Column(name = "PROJECTID")
private Long projectId;
....
....
@ManyToOne
@JoinColumn(name = "EMPLOYEENUMBER", referencedColumnName = "EMPLOYEENUMBER")
private Employee empNumber;
@ManyToOne
@JoinColumn(name = "INITIATEDBY", referencedColumnName = "EMPLOYEENUMBER")
private Employee initiatedBy;
Run Code Online (Sandbox Code Playgroud)
雇员
@Entity
@Table(name = "EMPLOYEES")
public class Employee {
@Id
@Column(name = "EMPLOYEENUMBER")
private String employeeNo;
@Column(name = "EMPLOYEENAME")
private String employeeName;
.....
.....
@OneToMany(mappedBy = "empNumber")
private Set<Project> employeeProject;
@OneToMany(mappedBy = "initiatedBy")
private Set<Project> employeeInitiatedBy;
.....
Run Code Online (Sandbox Code Playgroud)
在DAOImpl类我有
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Project> c = cb.createQuery(Project.class);
Root<Project> emp = c.from(Project.class);
c.orderBy(cb.desc(emp.get("projectNo")));
c.select(emp);
TypedQuery<Project> q = entityManager.createQuery(c);
Run Code Online (Sandbox Code Playgroud)
我试过了
Coalesce<String> coalesce = cb.coalesce();
coalesce.value(emp.<String>get("employeeName"));
coalesce.value("System Generated");
Run Code Online (Sandbox Code Playgroud)
但是,当我跑步时,我得到例外
java.lang.IllegalArgumentException: Unable to resolve attribute
[employeeName] against path
Run Code Online (Sandbox Code Playgroud)
对此的任何帮助都非常值得一提.
Mik*_*unu 10
第一个问题是在使用JPA实体作为查询结果时可能存在误解.当实体用作查询结果时,它们镜像数据库的状态.替换Employee.empName为数据库中的值以外的值与此相矛盾.
直到可以通过CriteriaBuilder.construct实现的某一点.结果对象(也可以是实体)是通过构造函数创建的,构造函数必须将所有选择项作为参数.不幸的是,它与对象图一起不能很好地发挥(在这种情况下Project连接Employee).
第二个问题是在get("employeeName")调用以下内容时Project,它没有这样的属性:
Root<Project> emp = c.from(Project.class);
...
coalesce.value(emp.<String>get("employeeName"));
Run Code Online (Sandbox Code Playgroud)
通常,coalesce可以如下使用(但由于上面所说的,这并不能单独解决问题):
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> c = cb.createQuery(String.class);
Root<Employee> emp = c.from(Employee.class);
CriteriaBuilder.Coalesce<String> coalesce = cb.coalesce();
coalesce.value(emp.<String>get("employeeName"));
coalesce.value("System Generated");
c.select(coalesce);
TypedQuery<String> q = em.createQuery(c);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14054 次 |
| 最近记录: |