[英]Join on JPQL, CreateQuery
试图弄清JPQL CreateQuery上的联接如何工作。 我对带有SQL代码的经理姓名有部分搜索功能:
SELECT
e.EMPLOYEE_ID AS empId,
e.FIRST_NAME AS empFirstName,
e.LAST_NAME AS empLastName,
m.FIRST_NAME || ' ' || m.LAST_NAME AS empMgrName
FROM
EMPLOYEES e
LEFT JOIN
EMPLOYEES m ON e.MANAGER_ID = m.EMPLOYEE_ID
WHERE
LOWER(m.FIRST_NAME || ' ' || m.LAST_NAME) LIKE '%"ManagerName"%'
我试图将其转换为JPQL格式,然后提出了以下建议:
StringBuilder query = new StringBuilder();
query.setLength(0);
query.append(" FROM ");
query.append(" Employee e ");
query.append(" JOIN ");
query.append(" e.Manager m ");
query.append(" WHERE 1 = 1 ");
query.append(" LOWER(m.FIRST_NAME || ' ' || m.LAST_NAME) LIKE :empMgrName ");
Query listEmpQuery = JPA.em().createQuery(query.toString(), Employee.class);
if (!StringUtil.isNullOrEmpty(strMgr)) {
listEmpQuery.setParameter("empMgrName", "%" + strMgr.toLowerCase() + "%");
}
List<Employee> listEmp = listEmpQuery.getResultList();
假设用户将“ ill gat”的值输入到strMgr
以搜索经理名称“ Bill Gates”。 它应该搜索经理帐单门下的员工。 但是在此代码中会发生ff错误:
IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [models.db.Employee]]
我做错了什么?
参考:Employee.class
@Entity
@Table(name="EMPLOYEES")
@SequenceGenerator(name = "EMPLOYEES_SEQ", sequenceName = "EMPLOYEES_SEQ")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "EMPLOYEES_SEQ")
public Integer EMPLOYEE_ID;
public String FIRST_NAME;
public String LAST_NAME;
@OneToOne
@JoinColumn(name="MANAGER_ID")
public Employee Manager;
我自己以“经理”身份将经理加入员工
问题是,当查询中有多个实体时,您必须指定要作为结果的实体(除非它是一个投影)。
query.append(" SELECT e")
query.append(" FROM ");
query.append(" Employee e ");
query.append(" JOIN ");
query.append(" e.Manager m ");
如果要让经理作为结果,则SELECT m
。
LIKE
子句很好..它的构建是为了防止SQL注入。
您想要实现的是LEFT OUTTE FETCH JOIN:
query.append("SELECT e FROM ");
query.append(" Employee e ");
query.append("LEFT JOIN FETCH ");
query.append(" e.Manager");
query.append(" WHERE LOWER(CONCAT(m.FIRST_NAME, ' ', m.LAST_NAME)) LIKE :empMgrName ");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.