gpt4 book ai didi

hibernate - JPA 中 Coalesce 或 Case 语句的使用

转载 作者:行者123 更新时间:2023-12-02 23:29:51 25 4
gpt4 key购买 nike

如何使用 CriteriaBuilder 在 JPA 2 中使用 coalescecase 语句

对于许多记录,initializedBy 将为空,因此这些记录的employeeName 将为空。对于那些数据库表中的itiatedBy员工为空的项目,如果employeeName为空,我想显示系统生成

我在实体中有以下关系

项目

@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;

员工

@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;

.....

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);

我尝试过

Coalesce<String> coalesce = cb.coalesce();
coalesce.value(emp.<String>get("employeeName"));
coalesce.value("System Generated");

但是当我运行时,我遇到了异常

java.lang.IllegalArgumentException: Unable to resolve attribute 
[employeeName] against path

对此的任何帮助都非常值得赞赏。

最佳答案

第一个问题是在使用 JPA 实体作为查询结果时可能会产生误解。当实体用作查询结果时,它们反射(reflect)数据库的状态。将 Employee.empName 替换为数据库中以外的值与此相矛盾。

直到可以通过 CriteriaBuilder.construct 实现的某个点。结果对象(也可以是实体)是通过构造函数创建的,该构造函数必须将所有选择项作为参数。不幸的是,这与对象图(本例中的 Project 和连接的 Employee)不能很好地配合使用。

第二个问题是在下面的get("employeeName")中为Project调用,并且它没有这样的属性:

Root<Project> emp = c.from(Project.class);
...
coalesce.value(emp.<String>get("employeeName"));

一般来说,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);

关于hibernate - JPA 中 Coalesce 或 Case 语句的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17922012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com