1

我有 3 个实体,Mouvement 链接 Agent 和 Poste。我不能直接加入邮政和代理,因为这取决于移动的日期。

@NamedEntityGraph(name = "graph.Agent.poste",
        attributeNodes = @NamedAttributeNode(value = "poste"))
@Entity
@Table(name = "agent")
public class Agent extends RestaurableEntity<Long>  {
    //fields firstname lastname birthdate...
     @ManyToOne(fetch = FetchType.LAZY)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JoinFormula("(" +
            "SELECT TOP 1 CASE WHEN (tm.arrivee=1 ) THEN m.id_poste ELSE (NULL) END " +
            "FROM mouvement m, type_mouvement tm " +
            "WHERE m.id_agent = id " +
            "AND m.id_type_mouvement=tm.id "+
            "AND m.supprime=0 "+
            "AND m.date<=GETDATE() "+
            "ORDER BY m.date DESC " +
            ")")
    private Poste poste;

}
@Entity
@Table(name = "poste")
@NamedEntityGraph(name = "graph.Poste.agent",
        attributeNodes = @NamedAttributeNode(value = "agent", subgraph = "agent"))
public class Poste extends RestaurableEntity<Integer> {
     @ManyToOne(fetch = FetchType.LAZY)
    @JoinFormula("(" +
            "SELECT TOP 1 CASE WHEN (tm.arrivee=1) THEN m.id_agent ELSE (NULL) END " +
            "FROM mouvement m, type_mouvement tm " +
            "WHERE m.id_poste = id " +
            "AND m.id_type_mouvement=tm.id " +
            "AND m.supprime=0 " +
            "AND m.date<=GETDATE() " +
            "ORDER BY m.date DESC " +

            ")")

    private Agent agent;
}
@Entity
@Table(name = "mouvement")
public class Mouvement extends RestaurableEntity<Long> {

    @Column(name = "date", nullable = false)
    private Date date;

    @ManyToOne
    @JoinColumn(name = "id_agent")
    private Agent agent;

    @ManyToOne
    @JoinColumn(name = "id_poste", nullable = false)
    private Poste poste;
}
@Transactional
public interface AgentRepository extends JpaRepository<Agent, Long> {
  @EntityGraph(value="graph.Agent.poste",type = EntityGraph.EntityGraphType.LOAD)
    @Query("select a from Agent a")
    List<Agent> findAllWithPoste();
}

我的问题是,当我调用 findAllWithPoste() 时,我用他们的 poste 检索代理列表,但我也将代理放在我不想加载的 poste 中以节省时间。有谁知道如何加载 poste 而无需在 poste 中加载代理?

PS:我已经尝试将我的 JoinFormula 转换为存储库方法,但没有成功。

 @Query("select new Agent(a,( select limit 1 p from Mouvement m, Poste p where m.agent.id=a.id and m.id_poste=p.id and m.date<= current_date() order by m.date desc) )  from Agent a")
    List<Agent> findAllWithPoste();
4

0 回答 0