Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-TypedQuery.getResultList()返回同一对象的列表_Java_Hibernate_Jpa_Criteria - Fatal编程技术网

Java Hibernate-TypedQuery.getResultList()返回同一对象的列表

Java Hibernate-TypedQuery.getResultList()返回同一对象的列表,java,hibernate,jpa,criteria,Java,Hibernate,Jpa,Criteria,以下是对该问题的更详细且可能更好的描述: 我做了一个简单的select查询。返回列表包含记录/对象的确切数量,就像我在数据库中执行相同的查询一样,但问题是所有对象都是相同的 对于ex,这是DB中的结果(我删除了空值): 26801 01-01-JAN-00 7 31-DEC-99 7 Obere Kirchstr。26 CH 8304 Walliselln 26801 01-JAN-00 2 31-DEC-99 2 Obere Kirchstr。26第8304章瓦利塞伦 这是变量地址的内容,我可

以下是对该问题的更详细且可能更好的描述:

我做了一个简单的select查询。返回列表包含记录/对象的确切数量,就像我在数据库中执行相同的查询一样,但问题是所有对象都是相同的

对于ex,这是DB中的结果(我删除了空值):
26801 01-01-JAN-00 7 31-DEC-99 7 Obere Kirchstr。26 CH 8304 Walliselln
26801 01-JAN-00 2 31-DEC-99 2 Obere Kirchstr。26第8304章瓦利塞伦

这是变量地址的内容,我可以在执行查询后的调试期间在Eclipse中看到:

地址数组列表(id=81)
elementData对象[10](id=86)
[0]DLDBAddress(id=82)
[1] DLDBAddress(id=82)
[2] 空

modCount 1
2号

DLDBAddress[persid=26801,valPeriodStart=1900-01-01,valPeriodEnd=9999-12-31,addressNr=7,addressType=7,addressRow1=null,addressRow2=Obere Kirchtr.26,addressRow3=null,addressRow3=null,country=CH,postalCode=8304,city=Walliselln,phoneNr=null,faxNr=null,sekretaryPhoneNr=null,AlterPhoneNR=null,pagerNr=null]

DLDBAddress[persid=26801,valPeriodStart=1900-01-01,valPeriodEnd=9999-12-31,addressNr=7,addressType=7,addressRow1=null,addressRow2=Obere Kirchtr.26,addressRow3=null,country=CH,postalCode=8304,city=Walliselln,phoneNr=null,faxNr=null,sekretaryPhoneNr=null,AlterPhoneNR=null,pagerNr=null]]

如您所见,这两个对象是相同的。它们应该不同于addressNr和addressType

这是我构建查询的代码片段:

public static <T> List<T> findBy(EntityManager eM, Class<T> boClass, String whereClause, String whereValue)  
 {
    EntityManager entityManager = eM;
    Query query = entityManager.createQuery("from " + boClass.getName() + " s where s." + whereClause + " = " + whereValue);
    ...
    return (List<T>) query.getResultList();
}
这里是实体:

@Entity
@Table(name = "V_DLDB_ADRESSE", schema="NETHZ")
public class DLDBAddress
{
  @Id
  @Column(name = "PERSID", insertable = false, updatable = false)
  private Integer   persid;
  @Temporal(TemporalType.DATE)
  @Column(name = "VONDAT", insertable = false, updatable = false)
  private Date   valPeriodStart;
  @Temporal(TemporalType.DATE)
  @Column(name = "BISDAT", insertable = false, updatable = false)
  private Date   valPeriodEnd;
  @Column(name = "ADRNUM", insertable = false, updatable = false)
  private Integer addressNr;
  @Column(name = "ADRTYP", insertable = false, updatable = false)
  private Integer addressType;
  @Column(name = "ADRZEIL1", insertable = false, updatable = false)
  private String addressRow1;
  @Column(name = "ADRZEIL2", insertable = false, updatable = false)
  private String addressRow2;
  @Column(name = "ADRZEIL3", insertable = false, updatable = false)
  private String addressRow3;
  @Column(name = "ADRLAND", insertable = false, updatable = false)
  private String country;
  @Column(name = "ADRPLZ", insertable = false, updatable = false)
  private String postalCode;
  @Column(name = "ADRORT", insertable = false, updatable = false)
  private String city;
  @Column(name = "ADRTEL", insertable = false, updatable = false)
  private String phoneNr;
  @Column(name = "ADRFAX", insertable = false, updatable = false)
  private String faxNr;
  @Column(name = "ADRSEKTEL", insertable = false, updatable = false)
  private String secretaryPhoneNr;
  @Column(name = "ADRAUSWTEL", insertable = false, updatable = false)
  private String alternatPhoneNr;
  @Column(name = "ADRPSA", insertable = false, updatable = false)
  private String pagerNr;

...
我错过什么了吗

啊,我正在连接一个Oracle数据库

提前谢谢 弗朗西斯科

您将PERSID定义为@Id,它是主键。对于您的应用程序来说,它真的是独一无二的吗?从行为上看不是。但对于Hib来说,它必须是

那么会发生什么:

  • 数据库中有两条以上的记录,PERSID=26801
  • 您可以在PERSID=26801的位置查询它们
  • SQL查询返回两个+行
  • Hib加载第一个,并将其放入会话,并将PERSID作为密钥(因为它被标记为@Id)。对象被放置到结果列表中
  • Hib加载第二个,注意到会话中已经存在一个具有相同@Id的对象,并将引用放入结果列表中。行数据被忽略
  • 这样你就得到了两份以上的副本

  • 1.我更可能使用hql而不是CriteriaBuilder,因为查询更容易阅读。2.如果没有看到传递给方法的where子句,就很难告诉您出了什么问题。根据我的经验,在使用JPA和Hibernate EntityManager时,如果id不是唯一的,就会发生这种情况,这在JPA中是必需的。Hibernate EntityManager完全实现了JPA2,因此在这里也应该适用。您也会发布您的实体吗?Hibernate生成的实际SQL是什么?更改Hibernate配置以显示该信息。这也许能更好地解释问题所在。埃里克,你是对的。在我的类中,我将persid设置为@Id,但它不是唯一的。我定义了一个复合ID,现在它可以工作了!非常感谢。贴出的答案没有注意到您在评论中提到问题已经解决。无论如何,我的回答可能有助于解释Hib的行为。
    @Entity
    @Table(name = "V_DLDB_ADRESSE", schema="NETHZ")
    public class DLDBAddress
    {
      @Id
      @Column(name = "PERSID", insertable = false, updatable = false)
      private Integer   persid;
      @Temporal(TemporalType.DATE)
      @Column(name = "VONDAT", insertable = false, updatable = false)
      private Date   valPeriodStart;
      @Temporal(TemporalType.DATE)
      @Column(name = "BISDAT", insertable = false, updatable = false)
      private Date   valPeriodEnd;
      @Column(name = "ADRNUM", insertable = false, updatable = false)
      private Integer addressNr;
      @Column(name = "ADRTYP", insertable = false, updatable = false)
      private Integer addressType;
      @Column(name = "ADRZEIL1", insertable = false, updatable = false)
      private String addressRow1;
      @Column(name = "ADRZEIL2", insertable = false, updatable = false)
      private String addressRow2;
      @Column(name = "ADRZEIL3", insertable = false, updatable = false)
      private String addressRow3;
      @Column(name = "ADRLAND", insertable = false, updatable = false)
      private String country;
      @Column(name = "ADRPLZ", insertable = false, updatable = false)
      private String postalCode;
      @Column(name = "ADRORT", insertable = false, updatable = false)
      private String city;
      @Column(name = "ADRTEL", insertable = false, updatable = false)
      private String phoneNr;
      @Column(name = "ADRFAX", insertable = false, updatable = false)
      private String faxNr;
      @Column(name = "ADRSEKTEL", insertable = false, updatable = false)
      private String secretaryPhoneNr;
      @Column(name = "ADRAUSWTEL", insertable = false, updatable = false)
      private String alternatPhoneNr;
      @Column(name = "ADRPSA", insertable = false, updatable = false)
      private String pagerNr;
    
    ...
    
    where dldbaddres0_.PERSID=26801
    
    @Id
      @Column(name = "PERSID", insertable = false, updatable = false)