1
因此,我使用的是最新的Hibernate 5.x版本。我正在嘗試做一個簡單的查詢示例。Hibernate 5 Query by Example添加條件
這裏是hibernate的實體類:
@SuppressWarnings("serial")
@Entity
@Table(name = "company")
public class CompanyEntity implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "company_id")
private long companyId;
// `account_enabled` varchar(15) NOT NULL,
@Column(name = "company_enabled", columnDefinition = "BIT")
private boolean companyEnabled;
@Column(name = "company_name")
private String companyName;
@Column(name = "company_address1")
private String address1;
@Column(name = "company_address2")
private String address2;
@Column(name = "company_city")
private String addressCity;
@Column(name = "company_state")
private String addressState;
@Column(name = "company_postal_code")
private String addressPostalCode;
@Column(name = "company_country")
private String addressCountry;
@Column(name = "company_phone")
private String phone;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "company_parent")
private CompanyEntity parent;
@Column(name = "entered_by")
private long enteredBy;
@Column(name = "entered_date")
@Temporal(TemporalType.TIMESTAMP)
private Date enteredDate;
@Column(name = "edited_by")
private long editedBy;
@Column(name = "edited_date")
@Temporal(TemporalType.TIMESTAMP)
private Date editedDate;
... getters, setters, hashCode, equals, toString
as auto-generated by Eclipse
...'
}
,這裏是在DAO查詢舉例:
@Override
public List<CompanyEntity> getCompanyEntityByExample(CompanyEntity exampleEntity)
{
Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(CompanyEntity.class).add(Example.create(exampleEntity));
List<CompanyEntity> companyEntityList = criteria.list();
System.out.println("getCompanyEntityByExample: companyEntityList: size=" + companyEntityList.size());
System.out.println("getCompanyEntityByExample: companyEntityList=" + companyEntityList);
return companyEntityList;
}
,這裏是測試此測試:
@Test
public void testGetCompanyByExample()
{
String addressCity = "Boston";
CompanyEntity exampleEntity = new CompanyEntity();
exampleEntity.setAddressCity(addressCity);
List<CompanyEntity> companyList = companyDao.getCompanyEntityByExample(exampleEntity);
assertNotNull(companyList);
assertEquals(true, companyList.size() == 1);
}
我知道與數據庫記錄,應該至少有一條記錄返回,但在這種情況下,我不g等任何數據。
這裏得到執行的實際查詢:
select this_.company_id as company_1_1_1_, this_.company_address1 as company_2_1_1_, this_.company_address2 as company_3_1_1_, this_.company_city as company_4_1_1_, this_.company_country as company_5_1_1_, this_.company_postal_code as company_6_1_1_, this_.company_state as company_7_1_1_, this_.company_enabled as company_8_1_1_, this_.company_name as company_9_1_1_, this_.edited_by as edited_10_1_1_, this_.edited_date as edited_11_1_1_, this_.entered_by as entered12_1_1_, this_.entered_date as entered13_1_1_, this_.company_parent as company15_1_1_, this_.company_phone as company14_1_1_, companyent2_.company_id as company_1_1_0_, companyent2_.company_address1 as company_2_1_0_, companyent2_.company_address2 as company_3_1_0_, companyent2_.company_city as company_4_1_0_, companyent2_.company_country as company_5_1_0_, companyent2_.company_postal_code as company_6_1_0_, companyent2_.company_state as company_7_1_0_, companyent2_.company_enabled as company_8_1_0_, companyent2_.company_name as company_9_1_0_, companyent2_.edited_by as edited_10_1_0_, companyent2_.edited_date as edited_11_1_0_, companyent2_.entered_by as entered12_1_0_, companyent2_.entered_date as entered13_1_0_, companyent2_.company_parent as company15_1_0_, companyent2_.company_phone as company14_1_0_ from company this_ left outer join company companyent2_ on this_.company_parent=companyent2_.company_id where (this_.company_city=? and this_.company_enabled=? and this_.edited_by=? and this_.entered_by=?)
如果您發現where子句,它說:
where (this_.company_city=? and this_.company_enabled=? and this_.edited_by=? and this_.entered_by=?)
,它應該是唯一的:
where (this_.company_city=?)
所以,額外的標準是與我的查詢搞亂,我無法得到正確的結果。
我在想我該如何糾正和解決這個問題?我多次搜索Google,並在我來到這裏之前先檢查了休眠論壇。 任何幫助,非常感謝。
謝謝!
這意味着我永遠不能使用休眠示例......我永遠不知道用戶將作爲輸入用戶或編輯用戶。我可以將它們更改爲UserEntity並擺脫原語....我可以使布爾值爲布爾值。有一個更好的方法來解決這個問題,或者我想我不會使用Hibernate By Example。 – tjholmes66
也許你可以將它改爲它們的對象框:Boolean和Long,並添加到'@Column(nullable = false)'字段。所以當你創建示例對象時,它們將保持爲空,並且如果這些字段爲空,Hibernate將不會持久保存該對象。 –
是的。這並不理想,但我認爲這是最好的解決方案!謝謝! – tjholmes66