Java 在JPQL、CreateQuery上加入
试图弄清楚JPQL CreateQuery上的联接是如何工作的。我有一个使用SQL代码部分搜索经理姓名的功能:Java 在JPQL、CreateQuery上加入,java,hibernate,jpa,playframework,jpql,Java,Hibernate,Jpa,Playframework,Jpql,试图弄清楚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
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();
我做错了什么
参考:
雇员阶级
@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;
我以“经理”的身份将经理自加入到员工中。问题是,当查询中有多个实体时,您必须指定要作为结果的实体(除非是投影) 或者,如果您想让manager作为结果,请选择m
LIKE
子句很好。。它是为了防止sql注入而构建的。问题是,当查询中有多个实体时,必须指定要作为结果的实体(除非是投影)
或者,如果您想让manager作为结果,请选择m
LIKE
子句很好。。它是为防止sql注入而构建的。您试图实现的是保留外部获取连接:
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 ");
您试图实现的是左外获取连接:
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 ");
不妨看看Java命名约定,尤其是属性名。看看变量部分:JPQL以“SELECT{alias}”开头,任何JPQL文档都会告诉您这一点。“| |”是无效的JPQL,但有一个CONCAT函数。本文档将告诉您,Too还可以查看Java命名约定,尤其是属性名称。看看变量部分:JPQL以“SELECT{alias}”开头,任何JPQL文档都会告诉您这一点。“| |”是无效的JPQL,但有一个CONCAT函数。该文档会告诉您,您已将其从外部联接更改为内部联接。我认为进行获取连接是一种很好的做法,它可以避免在多通关系中重复数据。您将其从外部连接更改为内部连接。而且我认为进行获取连接是一种很好的做法,它可以避免在多通关系中重复数据。
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 ");