【问题标题】:How to join three classes in JPQL?如何在 JPQL 中加入三个班级?
【发布时间】:2017-10-29 22:17:08
【问题描述】:

我有以下课程:

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

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

编辑1:

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

此请求不显示“CheckLists”类的所有 CheckLists 和已回答的 checkLists(在“ResponsesCheckLists”类中找到)。

编辑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] 的上下文中 路径 [/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;
     }

-> 实施此解决方案后,请求(edit2)不显示设备清单列表。

编辑3:

@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 查询以显示已回答(答案在“ResponsesCheckLists”类中)但尚未回答(列表的其余部分在“checkLists”类中)的清单列表。但是我的测试显示设备对象增加了一倍。

谢谢;

【问题讨论】:

  • 如果您遵循 JPA 文档,您会知道连接跨越关系。为了让人们建议您的加入应该是什么,您也需要发布实体,显示关系并显示您尝试过的内容
  • 我按照您说的更新帖子,先生,
  • 你为什么删除你的答案??

标签: mysql jpa jpql


【解决方案1】:
     "SELECT e "
        +" FROM Equipements "
        +" LEFT JOIN fetch e.checks c "
        +" LEFT JOIN fetch c.ResponsesChecks r"
        +" WHERE ...."

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

【讨论】:

  • 谢谢您的回答先生,但这显示以下问题:Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [com.SSC.DAO.Entities.Equipements.checks, com.SSC.DAO.Entities.CheckLists.ResponsesChecks]
  • 这对我来说也是新的......这里有一些不同的解决方案stackoverflow.com/questions/4334970/…
  • 感谢链接,加入获取问题已解决。关于请求,我尝试执行您的建议,它只显示设备信息。
  • 你说的显示是什么意思?
  • 你给出的请求返回设备类的对象:` { "idEquipements": 1, "nomEq": "xd", "dateAjoutEq": "2017/04/09 20:37 :58", "dateModificationEq": "2017/04/09 20:48:40" },`
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2021-09-09
相关资源
最近更新 更多