Java Hibernate-TypedQuery.getResultList()返回同一对象的列表
以下是对该问题的更详细且可能更好的描述: 我做了一个简单的select查询。返回列表包含记录/对象的确切数量,就像我在数据库中执行相同的查询一样,但问题是所有对象都是相同的 对于ex,这是DB中的结果(我删除了空值):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章瓦利塞伦 这是变量地址的内容,我可
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来说,它必须是
那么会发生什么:
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)