我正在使用 hibernate criteria api 来获取txn和txn_products表的数据。 以下是映射。
class Txn:
@Entity
@DynamicUpdate(value=true)
@Table(name="txn")
public class Txn
{
@OneToMany(fetch=FetchType.LAZY , mappedBy = "transaction" , cascade = CascadeType.ALL)
Set<TxnProduct> txnProducts = null;
@Id
@Column(name="id" , nullable=false)
private String id;
......
}
class TxnProduct:
@Entity
@DynamicUpdate(true)
@Table(name="txn_product")
public class TxnProduct
{
@Id
@Column(name="id" , nullable=false)
private String id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="txn_id")
private Txn transaction ;
.....
}
业务逻辑:
Session sx = .......... ;
Criteria Q = sx.createCriteria(Txn.class, "txn");
Q.createAlias("txn.txnProducts", "txnProducts" , JoinType.INNER_JOIN);
List<Txn> L = (List<Txn>) Q.list();
logger.info(L) ;
for(Txn T : L)
{
logger.info(T);
logger.info(T.getTxnProducts());
}
sx.close();
执行业务逻辑List L
时,为数据库中的每个Txn
返回TxnProduct
对象,但我对hibernate标准的期望是为txn中的每一行返回Txn
个对象表格并在其中设置Set<TxnProduct>
。
我尝试了Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
,但没有帮助。
感谢。
答案 0 :(得分:1)
Q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
应该适用于大多数情况,除非我们对setFirstResult
和setMaxResult
这样的父实体使用分页。 JoinType
或FetchMode
可能存在问题。
使用q.list()
包裹Set
将是更好的选择,无论任何提取模式。就像是
Set<Txn> resutls = new HashSet<Txn>(L));
或者如果要再次返回列表,请使用list包装该集合
List<Txn> results = new ArrayList<Txn>(new HashSet<Txn>(L));