【发布时间】:2013-12-14 09:37:07
【问题描述】:
我有这两个实体(这里是简化版本):
主题:
@Entity
public class Topic implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
@ManyToMany
@JoinTable(
name = "topic_member",
joinColumns = @JoinColumn( name = "topic" ),
inverseJoinColumns = @JoinColumn( name = "member" ) )
@JoinFetch
private List<Member> participants = new ArrayList<Member>();
...
会员:
@Entity
public class Member implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Long id;
...
这些通过连接表 topic_member(member, topic) 关联,通过单向 @ManyToMany 关系。
当我插入东西时一切正常,这里没问题。
但是当我想选择东西时,它变得更加棘手。假设我想选择与特定成员相关的所有主题。我编写了以下 JPQL 查询:
SELECT t FROM Topic t WHERE :member MEMBER OF t.participants ORDER BY t.id DESC
然后我写了这个:
TypedQuery<Topic> query = em.createQuery( MY_JPQL_REQUEST, Topic.class );
query.setParameter( PARAM_MEMBER, member );
return query.getResultList();
而且效果很好。
但是有些奇怪的错误:似乎我不能在这个查询上使用分页! 例如,当我尝试这个时:
TypedQuery<Topic> query = em.createQuery( MY_JPQL_REQUEST, Topic.class );
query.setParameter( PARAM_MEMBER, member );
query.setFirstResult( 0 );
query.setMaxResults( 5 );
return query.getResultList();
它返回错误的实体数量。比如前一个返回5的时候,就只返回3...
我在这里缺少什么?我不明白会出什么问题。
我读过this page,我认为这里可能有些东西,但我不知道是什么。
[编辑] 如果有帮助,这是我在数据库中的连接表中的内容:
+-------------+-------------+ |会员 |话题 | +-------------+-------------+ | 1 | 1 | | 1 | 2 | | 1 | 3 | | 1 | 4 | | 1 | 5 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 2 | 4 | | 2 | 5 | +-------------+-------------+[解决方案] 感谢 Chris,我得到了它的工作。我不得不在@ManyToMany 字段上用@BatchFetch( BatchFetchType.JOIN ) 替换@JoinFetch,并查询SELECT DISTINCT(t) FROM ... 而不是SELECT t FROM ...。
【问题讨论】:
标签: jpa pagination many-to-many eclipselink jpql