2014-02-12 63 views
0

Hibernate criteria.list()返回兩個條目而不是一個。在數據庫中只有TaxTable的條目和2個相應的TaxEntries。我認爲我做的連接有問題。這裏是我的代碼: 稅率表:criteria.list()返回兩個條目而不是一個

@Entity 
@Table(name = "tax_table") 
public class TaxTable implements Serializable { 
    @Id @GeneratedValue 
    private Long id; 
    private String name; 
    @OneToMany(mappedBy = "taxTable",cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<TaxEntry> entries; 
    ... 

TaxEntry:

@Entity 
@Table(name = "tax_entry") 
public class TaxEntry implements Serializable { 
    @Id @GeneratedValue 
    private Long id; 
    private String name; 
    private BigDecimal percentage; 

    @ManyToOne 
    @JoinColumn(name = "account_id") 
    private Account toAccount; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "taxtable_id") 
    private TaxTable taxTable; 
    ... 

爲了獲取結果我用下面的代碼:

@SuppressWarnings("unchecked") 
@Transactional 
public List<TaxTable> findAll() { 
    Session session = sessionFactory.getCurrentSession(); 
    Criteria taxTableCriteria = session.createCriteria(TaxTable.class); 
    taxTableCriteria.addOrder(Order.asc("name")); 
    return taxTableCriteria.list(); 
}  

在我的測試中,我創建一個稅率表2個taxEntries :

... 
taxEntryVAT.setTaxTable(taxTable); 
taxEntryWT.setTaxTable(taxTable); 
taxEntries.add(taxEntryVAT); 
taxEntries.add(taxEntryWT); 
taxTable.setEntries(taxEntries); 
taxTableDao.create(taxTable); 

而且取將返回2個taxTables列表具有相同ID,而不是一個:

List<TaxTable> result = taxTableDao.findAll(); 

任何想法?

由於

回答

1

使用: criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

+0

謝謝你的工作。你能告訴我爲什麼嗎? – clausmc

+1

通常hibernate在表上執行左外連接。因此它將包含左表中的所有行和右結果重複行中的匹配行。通過指定Criteria.DISTINCT_ROOT_ENTITY,Hibernate將知道不會包含所有從左邊只匹配的行可以包含在結果中。這就是我瞭解到目前爲止..更多信息,你可以谷歌。 –

相關問題