【发布时间】:2018-08-03 10:53:54
【问题描述】:
我正在尝试实现这样的示例:Person 类有一个它喜欢的地方的列表。但是当我想查询它时,我希望结果是每个人只有最喜欢的地方(只是第一个而不是全部)。所以我这样做了:
@Entity
class Person{
...
@ManyToMany(cascade = {CascadeType.REFRESH,CascadeType.PERSIST}, fetch = FetchType.EAGER)
@JoinTable(name = "person_favorite_place",
joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "place_id", referencedColumnName = "id")
)
@OrderColumn(name="favorite_place_order")
List<Place> favoritePlaces;
}
在存储库中,我做到了:
public interface PersonRepository extends JpaRepository<Person, Long> {
@Query(value = "select person0_.id as id1_0_0_, person0_.age as age2_0_0_, person0_.name as name3_0_0_, favoriteme1_.person_id as person_id1_1_1_, place2_.id as place_id2_1_1_, favoriteme1_.favorite_place_order as favorite3_1_, place2_.id as id1_3_2_, place2_.invented as invented2_3_2_, place2_.name as name3_3_2_ from person person0_ left outer join person_favorite_place favoriteme1_ on person0_.id=favoriteme1_.person_id left outer join place place2_ on favoriteme1_.place_id=place2_.id where person0_.id=:personId and favoriteme1_.favorite_place_order = 0", nativeQuery = true)
Person getPersonWithFavoritePlace(@Param("personId") Long personId);
}
但似乎有 2 个 sql 查询正在运行。第一个是:
select person0_.id as id1_0_0_, person0_.age as age2_0_0_, person0_.name as name3_0_0_, favoriteme1_.person_id as person_id1_1_1_, place2_.id as place_id2_1_1_, favoriteme1_.favorite_place_order as favorite3_1_, place2_.id as id1_3_2_, place2_.invented as invented2_3_2_, place2_.name as name3_3_2_ from person person0_ left outer join person_favorite_place favoriteme1_ on person0_.id=favoriteme1_.person_id left outer join place place2_ on favoriteme1_.place_id=place2_.id where person0_.id=:personId and favoriteme1_.favorite_place_order = 0
第二个:
select favoriteme0_.person_id as person_id1_1_0_, favoriteme0_.place_id as place_id2_1_0_, favoriteme0_.favorite_place_order as favorite3_0_, place1_.id as id1_3_1_, place1_.invented as invented2_3_1_, place1_.name as name3_3_1_ from person_favorite_place favoriteme0_ inner join place place1_ on favoriteme0_.place_id=place1_.id where favoriteme0_.person_id=?
我可以理解第一个,这完全是我要执行的查询,但第二个,我不知道它来自哪里。所以我认为,正因为如此,我拥有一个人所有最喜欢的地方,但不是最想要的。
有什么想法吗?
BR
PS:我已经在“findOne”方法的本机输出上编写了查询。最后添加了“and favoriteme1_.favorite_place_order = 0”。我也尝试过不加修改地使用确切的查询,它就像一个魅力!!
【问题讨论】: