名单这是问题的一个更,也许更好的描述:休眠 - TypedQuery.getResultList()返回相同的对象
我做一个简单的选择查询。返回列表包含记录/对象的确切数量,就像我在数据库中执行相同的查询一样,但问题是所有对象都是相同/相同的。
例如,这是DB中的结果(我删除了空值):
26801 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 CH 8304 Walliselln
这是可变的地址的内容作为我可以在调试期间看到它在Eclipse查询已被执行之后:
地址的ArrayList(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 Kirchstr。 26,addressRow3 = NULL,国家= CH,POSTALCODE = 8304,城市= Walliselln,phoneNr = NULL,faxNr = NULL,sekretaryPhoneNr = NULL,alternatPhoneNr = NULL,pagerNr =空]
DLDBAddress [persid = 26801,valPeriodStart = 1900-01-01,valPeriodEnd = 9999-12-31,addressNr = 7,addressType = 7,addressRow1 = null,addressRow2 = Obere Kirchstr。 26,addressRow3 = null,country = CH,postalCode = 8304,city = Walliselln,phoneNr = null,faxNr = null,sekretaryPhoneNr = null,alternatPhoneNr = null,pagerNr = null]]
正如你所看到的,对象是相同的。他们建议立即进行删除,而不是从addressNr和地址类型不同...
这是一段代码,我建立查询:
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();
}
,这是(很简单)结果查询:
从ch.ethz.id.wai.pdb.bo.DLDBAddress S其中s.persid = 26801
这是产生的查询:
Hibernate:
select
dldbaddres0_.PERSID as PERSID0_,
dldbaddres0_.ADRNUM as ADRNUM0_,
dldbaddres0_.ADRZEIL1 as ADRZEIL3_0_,
dldbaddres0_.ADRZEIL2 as ADRZEIL4_0_,
dldbaddres0_.ADRZEIL3 as ADRZEIL5_0_,
dldbaddres0_.ADRTYP as ADRTYP0_,
dldbaddres0_.ADRAUSWTEL as ADRAUSWTEL0_,
dldbaddres0_.ADRORT as ADRORT0_,
dldbaddres0_.ADRLAND as ADRLAND0_,
dldbaddres0_.ADRFAX as ADRFAX0_,
dldbaddres0_.ADRPSA as ADRPSA0_,
dldbaddres0_.ADRTEL as ADRTEL0_,
dldbaddres0_.ADRPLZ as ADRPLZ0_,
dldbaddres0_.ADRSEKTEL as ADRSEKTEL0_,
dldbaddres0_.BISDAT as BISDAT0_,
dldbaddres0_.VONDAT as VONDAT0_
from
NETHZ.V_DLDB_ADRESSE dldbaddres0_
where
dldbaddres0_.PERSID=26801
这里的实体:
@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数据库。
预先感谢 弗朗西斯
1.我更愿意使用hql而不是CriteriaBuilder,因为查询更容易阅读。 2.没有看到传递给方法的where子句,很难告诉你什么是错的。 – Speck 2011-03-18 13:23:46
根据我的经验,使用JPA和Hibernate EntityManager时,会发生这种情况,因为id不是唯一的,这在JPA中是必需的。 Hibernate EntityManager完全实现了JPA 2,所以在这里也应该适用。你会发布你的实体吗? – Erik 2011-03-18 13:24:46
什么是由Hibernate生成的实际SQL?改变你的Hibernate配置来显示这些信息。这可能会提供一个更好的解释,说明发生了什么问题。 – 2011-03-18 13:26:30