[英]Spring Data 'Left Join Fetch' query returning null
我的查询如下所示:
@Query("SELECT p FROM Pilot p LEFT JOIN FETCH p.playerShips WHERE p.nickname = (:nickname)")
到目前为止,一切都很好。 即使playerShips为空,我也正在获得Pilot实例。
现在,我只想获取不活动的船只,因此我将查询修改为如下形式:
@Query("SELECT p FROM Pilot p LEFT JOIN FETCH p.playerShips s WHERE p.nickname = (:nickname) AND s.active = false")
而且我作为飞行员已经空了,所以显然不起作用。
如果有人可以向我解释如何使用适用于子元素的WHERE子句创建JOIN FETCH查询,我将感到非常高兴。 提前致谢。
只需将其移动到加入条件:
@Query("SELECT p FROM Pilot p LEFT JOIN FETCH p.playerShips s ON s.active = false WHERE p.nickname = (:nickname)")
JPA 2.1中定义了ON子句
经过大量研究,我决定实现一个自定义存储库,以便可以使用Hibernate Filters,现在它可以工作了。
试点存储库:
@Repository
public interface PilotRepository extends JpaRepository<Pilot, Long>, PilotRepositoryCustom{
/*spring data methods here*/
}
PilotRepositoryCustom:
public interface PilotRepositoryCustom {
public Pilot findByNicknameFetchInactiveShips(String nickname);
}
PilotRepositoryImpl:
public class PilotRepositoryImpl implements PilotRepositoryCustom{
@PersistenceContext
EntityManager entityManager;
@Override
public Pilot findByNicknameFetchInactiveShips(String nickname) {
Session session = entityManager.unwrap(Session.class);
session.enableFilter("active").setParameter("active", false);
Query query = entityManager.createQuery(
"SELECT p FROM Pilot p " +
"LEFT JOIN FETCH p.playerShips ps " +
"LEFT JOIN FETCH ps.ship s " +
"WHERE p.nickname = (:nickname)");
query.setParameter("nickname", nickname);
return (Pilot)query.getSingleResult();
}
}
弹簧数据就是这样。 现在,过滤器配置:
试点实体:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pilot")
@Filter(name="active", condition = "active = :active")
private List<PlayerShip> playerShips;
PlayerShip实体:
@Entity
@Table(name="player_ship")
@FilterDef(name="active", parameters=@ParamDef(name="active",type="java.lang.Boolean"))
public class PlayerShip {
/*...*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "pilot_id")
private Pilot pilot;
/*...*/
}
重要提示:
如果在@ParamDef中使用布尔值,请确保键入java.lang.Boolean而不是Boolean 。 我已经花了一个多小时的时间在想为什么我一直在找不到参数/未定义错误 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.