2016-09-13 27 views
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,並在我來到這裏之前先檢查了休眠論壇。 任何幫助,非常感謝。

謝謝!

回答

2

字段company_enablededited_byentered_by是原語,所以他們對創造價值,爲布爾是假的,長期是0,所以當對象被創造的價值在那裏,當你調用過濾器休眠看到字段的值,並把它們放在查詢中。

+1

這意味着我永遠不能使用休眠示例......我永遠不知道用戶將作爲輸入用戶或編輯用戶。我可以將它們更改爲UserEntity並擺脫原語....我可以使布爾值爲布爾值。有一個更好的方法來解決這個問題,或者我想我不會使用Hibernate By Example。 – tjholmes66

+1

也許你可以將它改爲它們的對象框:Boolean和Long,並添加到'@Column(nullable = false)'字段。所以當你創建示例對象時,它們將保持爲空,並且如果這些字段爲空,Hibernate將不會持久保存該對象。 –

+1

是的。這並不理想,但我認爲這是最好的解決方案!謝謝! – tjholmes66