如何在JPQL中连接三个类?

问题描述:

我有以下的类:如何在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; 
} 

我要表明的回答清单(答案是在“ResponsesCheckLists”类)的名单,但没有回答(在列表的其余部分在“checkLists”类中)。

我有以下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" 
     ) 

该请求不显示“检查表”类的所有清单和被回答清单(在“ResponsesCheckLists”类中找到)。

EDIT2:

@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的错误:servlet的

1- Servlet.service()[DispatcherServlet的]与 路径[/ APP]上下文抛出异常[请求处理失败;嵌套0​​例外是 org.springframework.http.converter.HttpMessageNotWritableException: 无法写入内容:无限递归(的StackOverflowError)

2- WARN 3456 --- [NIO-8099-EXEC-3] .wsmsDefaultHandlerExceptionResolver :的 [org.springframework.http.converter.HttpMessageNotWritableException] 导致Exceptionjava.lang.IllegalStateException处理:不能调用 sendError()的反应一直致力于

解决方案后,错误Edit2;

添加注解@JsonIgnore

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

- >该溶液中的请求(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" 

    ) 

Resultat 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 
} 

-I取得了JPQL查询显示的回答清单列表(答案是在“ResponsesCheckLists “类),但尚未回答(列表的其余部分位于”checkLists“类中)。但是我的测试显示设备对象翻了一番。

谢谢;

+2

如果你曾跟随JPA的文档,你会知道,加入跨关系去。对于人们建议你的加入应该是什么,你需要发布的实体,显示的关系,并显示你已经尝试了什么 –

+0

我更新帖子,如你所说,先生, – Michael1

+0

你为什么删除你的答案? – Michael1

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

这将返回设备实体与合集已经进账

+0

谢谢你的回答,先生,但是这显示以下问题:'由于:org.hibernate.loader.MultipleBagFetchException:不能同时获取多个行囊:[com.SSC.DAO.Entities.Equipements.checks,com.SSC。 DAO.Entities.CheckLists.ResponsesChecks]' – Michael1

+0

这对我来说也是新的......这里有一些不同的解决方案https://stackoverflow.com/questions/4334970/hibernate-cannot-simultaneously-fetch-multiple-bags – Zeromus

+0

感谢链接,问题解决了联合获取。关于请求我尝试执行您的建议,它只显示设备的信息。 – Michael1