【问题标题】:How to write Spring Data JPA repository & entity to join two tables and where clause with multiple conditions如何编写 Spring Data JPA 存储库和实体以连接两个表以及具有多个条件的 where 子句
【发布时间】:2018-06-13 13:24:10
【问题描述】:

我可以在 Spring Data JPA 中使用 @OneToOne 使用主键关系加入两个实体 Employee 和 Department 并取得了结果,但我不知道如何将 where 子句应用于我的要求。以下是查询

select * from 
  Employee e1,
  Department d1
Where e1.emp_id = d1.dep_id
  And d1.crtn_time between to_date('08-NOV-2017 00:00', 'DD-MON-YYYY hh24:mi') 
  And to_date('08-NOV-2017 20:00', 'DD-MON-YYYY hh24:mi')
  And e1.EMP_CODE='10' and e1.Desg='Clerk'

在此条件下,我能够得到结果,其中 e1.emp_id = d1.dep_id 如下所示,两个实体使用一对一映射的代码。

存储库:

@Transactional(readOnly = true, transactionManager = "empDataTxnManager")
public interface EmpRepository extends JpaRepository<Employee, Long> {
}

员工:实体

@Entity
@Table(name = "Employee")
public class Employee {

    @Id
    @Column(name = "emp_id")
    private Integer id;
    @Column(name = "Emp_Code")
    private String empCode;
    @Column(name = "Desg")
    private String desg;

    @OneToOne(fetch=FetchType.LAZY,
            cascade=CascadeType.ALL, 
            mappedBy="emp")
    private Department department;

    ---- getters & setters omitted

部门实体

@Entity
@Table(name = "Department")
public class Department {
    @Id
    @Column(name = "dep_id")
    private Integer id;
    @Column(name = "crtn_time")
    private String crtnTime;

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "emp_id")
    private Employee emp;

    ----getters & setters omitted

我的问题是如何在 Repository 类中的 where 子句之后应用其余的“AND”条件。像在 Repository 或 Service 类中编写的任何 QueryByMethod(或)Criteria 一样。

我怎样才能获得给定查询的完整结果。

我参考了 spring data jpa 文档,但我无法找到确切的解决方案。

请建议是否有任何现有示例可以参考实现此要求

谢谢

【问题讨论】:

  • 我不明白你到底想要什么。会是这样的吗? @Query("select e1 from Employee e1, Department d1 Where e1.id = d1.id And d1.crtnTime between ?1 And ?2 And e1.empCode='10' and e1.desg='Clerk'") Employee findCuston(Date before, Date after);
  • @HenriqueFernandesCipriano 是的,我正在寻找一些东西来为两个实体创建查询。我可以使用上面的方法得到结果吗?我可以在我的存储库类中定义它吗?如果是这样,我不需要提及部门实体吗?请建议
  • 我对你的加入声明 e1.emp_id = d1.dep_id 感到困惑,你怎么能匹配 emp_id 和 dep_id 他们应该是不同的?另一点是员工与部门的关系必须是多对一的,因为许多员工可以为一个部门工作。如果您只是使用上面的代码,那么请使用不同的

标签: hibernate jpa spring-boot spring-data-jpa hibernate-criteria


【解决方案1】:

您可以在您的存储库上执行以下操作:

public class YourRepo extends Serializable{
...
   public List<Entity> findEntities( Type parameter ) {
        List<Entity> resultList = new ArrayList<Entity>();
        Entity e;
        String sqlQuery = buildDynamicQuery(); // Build your complex where
        TypedQuery<Object[]> q = getEntityManager().createNamedQuery( sqlQuery , Object[].class ); //Extract custom info from both tables.
        q.setParameter( "parameterName", parameter );

        for ( Object[] element : q.getResultList() ) {
            e= new Entity();
            e.setAtribute1( elemento[0].toString() );
            e.setAtribute2( elemento[1].toString() );
            e.setAtribute3( elemento[3].toString() );
            resultList .add(e);
        }
        return resultList;
    }
}

private String buildDynamicQuery( HistoricoGIDFiltro filtroBusqueda ) {
        String sqlQuery = "SELECT filed1, field2, field3 ... FROM Employee e1,
  Department d1 WHERE e1.emp_id = d1.dep_id ";
        if ( look if it has an employ code  ) {
            sqlQuery += " AND e1.EMP_CODE='10' ";
        }
        return sqlQuery;
    }

使用上面的代码,您可以创建自定义查询并提取自定义 来自不同表格的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2013-11-27
    • 2021-08-04
    • 2020-07-07
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多