如何在JPQL中加入三个类?

时间:2017-05-29 14:50:02

标签: mysql jpa jpql

我有以下课程:

@Entity
public class Equipements implements Serializable{

@Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long idEquipements;

@OneToMany(mappedBy="equipements", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private Collection<CheckLists> checks;
}

@Entity
public class CheckLists implements Serializable{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long idCheckLists;

private String titreCheck;

    private String recommendation;

    @ManyToOne
    @JoinColumn(name="equipements_id")
    private Equipements equipements;

    @OneToMany(mappedBy="CheckLts", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private Collection <ResponsesCheckLists> ResponsesChecks;
}

@Entity
public class ResponsesCheckLists implements Serializable{
@Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long idResponsesCHeck;

    @ManyToOne
    @JoinColumn(name="missionsId")
    private Missions Respmission;

    @ManyToOne
    @JoinColumn(name="checkLists_Id")
    private CheckLists CheckLts;
}

我试图显示已回答的检查清单列表(答案在&#34; ResponsesCheckLists&#34;类中)但尚未回答(清单的其余部分位于&#34) ; checkLists&#34; class)。

我有以下SQL查询:

SELECT * FROM equipements eq
LEFT JOIN check_lists checks
ON eq.id_equipements = checks.equipements_id 
LEFT JOIN responses_check_lists resp 
ON checks.id_check_lists = resp.check_lists_id
AND resp.missions_id = 15 
AND eq.id_equipements = 1 
ORDER BY checks.id_check_lists

我跟踪了互联网上的文件,但我没有在JPQL中正确转换我的查询。

以下查询仅显示在ResponsesCheckLists类中回答的检查清单:

@Query(
            "SELECT checks, r "
            + " FROM CheckLists checks "
            + " inner join checks.ResponsesChecks r"
            + " WHERE checks.equipements.idEquipements = :idEqp "
            + " AND r.Respmission.idMission= :idmiss "
            + " ORDER BY checks.idCheckLists ASC"
        )

我知道查询的属性将被类的属性所取代。但是如何同时加入三个班级。

EDIT1:

@Query(
            "SELECT c, r "
            +" FROM CheckLists c"
            +" LEFT JOIN c.ResponsesChecks r"
            +" JOIN fetch c.equipements e"
            +" JOIN fetch r.Respmission m"
            +" WHERE e.idEquipements = :idEqp"
            +" AND m.idMission= :idmiss"
            +" ORDER BY c.idCheckLists ASC"
        )

此请求不会显示&#34; CheckLists&#34;的所有CheckLists。 class和回答的检查列表(可在&#34; ResponsesCheckLists&#34;类中找到)。

编辑2:

@Query(
    "SELECT e "
         +" FROM Equipements e"
         +" LEFT JOIN fetch e.checks c "
         +" LEFT JOIN fetch c.ResponsesChecks r"
         + " where e.idEquipements = :idEqp "
          + " and r.Respmission.idMission = :idmiss "
          + " order by c.idCheckLists asc"
     )

编辑错误2:

  

1- Servlet.service()用于上下文中的servlet [dispatcherServlet]   path [/ App]引发异常[请求处理失败;嵌套   例外是   org.springframework.http.converter.HttpMessageNotWritableException:   无法写内容:无限递归(StackOverflowError)

     

2-WARN 3456 --- [nio-8099-exec-3]   .w.s.m.s.DefaultHandlerExceptionResolver:处理   [org.springframework.http.converter.HttpMessageNotWritableException]   导致Exceptionjava.lang.IllegalStateException:无法调用   响应提交后发送sendError()

错误Edit2的解决方案;

添加注释@JsonIgnore

   @JsonIgnore 
    Public Set <CheckLists> getChecks () 
    { 
    Return checks;
     }

- &GT;执行此解决方案后,请求(edit2)不会显示设备清单列表。

EDIT3:

@Query(
            "SELECT e "
                    +" FROM Equipements e , CheckLists c"
                    //+" LEFT JOIN fetch e.checks c "
                    +" LEFT JOIN c.ResponsesChecks r"
                    + " where e.idEquipements = :idEqp "
                    + " and r.Respmission.idMission = :idmiss "
                    + " order by c.idCheckLists asc"

     )

Edit3的结果:

[
{
"idEquipements": 1,
"nomEq": "Info",
"dateAjoutEq": "2017/04/09 20:37:58",
"dateModificationEq": "2017/04/09 20:48:40",
"checks": [] //133 items
},
{
"idEquipements": 1,
"nomEq": "Info",
"dateAjoutEq": "2017/04/09 20:37:58",
"dateModificationEq": "2017/04/09 20:48:40",
"checks": []//133 items
}

- 我做了一个JPQL查询来显示已回答的检查清单列表(答案在&#34; ResponsesCheckLists&#34;类中)但尚未回答(列表的其余部分位于&#34; checkLists&#34; class)。但我的测试显示设备对象加倍。

谢谢;

1 个答案:

答案 0 :(得分:0)

     "SELECT e "
        +" FROM Equipements "
        +" LEFT JOIN fetch e.checks c "
        +" LEFT JOIN fetch c.ResponsesChecks r"
        +" WHERE ...."

这将返回已获取集合的设备实体