Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPQL、CreateQuery上加入_Java_Hibernate_Jpa_Playframework_Jpql - Fatal编程技术网

Java 在JPQL、CreateQuery上加入

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

试图弄清楚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();
我做错了什么

参考: 雇员阶级

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