Jpa JPQL SELECT查询,其中where子句在命中表中where子句的多个结果时返回同一行

Jpa JPQL SELECT查询,其中where子句在命中表中where子句的多个结果时返回同一行,jpa,orm,persistence,jpql,dto,Jpa,Orm,Persistence,Jpql,Dto,我的表有两个主键:id和theme 查询: @NamedQueryname=Theme.findByID,query=从主题t中选择t,其中t.id=:id 假设,如果一个特定id有4行数据,那么我得到的列表大小为4,但第1行的数据在所有4个位置 TypedQuery tQuery=em.createnamedqueryteme.findByID,Theme.class; tQuery.setParameterid,id List<Theme> resultList = (L

我的表有两个主键:id和theme

查询: @NamedQueryname=Theme.findByID,query=从主题t中选择t,其中t.id=:id

假设,如果一个特定id有4行数据,那么我得到的列表大小为4,但第1行的数据在所有4个位置

TypedQuery tQuery=em.createnamedqueryteme.findByID,Theme.class; tQuery.setParameterid,id

    List<Theme> resultList = (List<Theme>)tQuery.getResultList();

    System.out.println("size of list : " + resultList.size());//returns 4

    resultList.forEach(System.err::println);/* is returning data in row 1 for the particular id 4 times*/

这里出了什么问题?

您是将该id映射为JPA中的id,还是将其映射为数据库中的复合pk的一部分?显示您的实体和映射。但我必须选择仅使用id,表中该id的所有主题。如果我创建id和主题的pk类,我将如何编写查询?我没有价值提供的主题。我不明白你的问题。如果它不是唯一的,则它不是一个ID。您的类有一个主题和ID列,这两个列用于唯一标识数据库中的对象/行,因此您需要指定JPA使用这两个列来唯一标识您的实体。在JPA中同时指定这两个字段并不会改变您使用应用程序或JPA的方式,您仍然可以按原样通过id字段进行查询。id类只影响传递给em.find方法的内容。首先试试。是的,我用重写的hashcode和equals方法创建了一个复合pk类。现在效果很好!现在所有的数据都正常了。多谢了,您是将该id映射为JPA中的id,还是将其映射为数据库中的复合pk的一部分?显示您的实体和映射。但我必须选择仅使用id,表中该id的所有主题。如果我创建id和主题的pk类,我将如何编写查询?我没有价值提供的主题。我不明白你的问题。如果它不是唯一的,则它不是一个ID。您的类有一个主题和ID列,这两个列用于唯一标识数据库中的对象/行,因此您需要指定JPA使用这两个列来唯一标识您的实体。在JPA中同时指定这两个字段并不会改变您使用应用程序或JPA的方式,您仍然可以按原样通过id字段进行查询。id类只影响传递给em.find方法的内容。首先试试。是的,我用重写的hashcode和equals方法创建了一个复合pk类。现在效果很好!现在所有的数据都正常了。非常感谢