我想将Hibernate Transformation用于Spring Data。
我有一个实体AgentRecord
,其属性为
@Entity
public class AgentRecord extends AbstractEntity<Long> {
@ManyToOne
private User processedBy;
private String description;
private RecordType recordType;
private AgentRecordStatus status;
}
我遵循将所需属性设置为名为AgentRecordDTO
的其他DTO并将其返回给客户端(gwt
)的做法。
public class AgentRecordDTO implements IsSerializable {
private long processedBy;
private String description;
private RecordType recordType;
private AgentRecordStatus status;
}
我没有获取实体的所有属性,而是想获取一些属性,并将它们设置为AgentRecordDTO
,就像new AgentRecordDTO()
我可以在hql中做的那样,但是想要用 Spring做数据规范。
我的AgentRepository
是
public interface AgentRecordRepository extends CrudRepository<AgentRecord, Long>, JpaSpecificationExecutor<AgentRecord> {
}
public Page<AgentRecordDTO> getAgentRecords(final long userId) {
SimplePageable page = new SimplePageable(1, 10); //my custom object
Page<AgentRecord> pages = agentRecordRepository.findAll(new Specification<AgentRecord>() {
@Override
public Predicate toPredicate(Root<AgentRecord> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//Projection plus Transformers.aliasToBean(AgentRecordDTO) missing here
Predicate predicate = cb.equal(root.get("processedBy").get("id"), userId);
if (null != predicate) {
predicate = cb.or(predicate, cb.equal(root.get("recordType"), RecordType.VERIFICATION_REQUEST));
predicate = cb.or(predicate, cb.equal(root.get("recordType"), RecordType.VERIFICATION));
}
return predicate;
}
}, new PageRequest(page.getPage(), page.getSize(), new Sort(new Order(Direction.DESC, "id"))));
return null;
}
2008年6月3日的Hibernate 3.2: Transformers for HQL and SQL是精彩的帖子,但
答案 0 :(得分:2)
不是直接的答案,而是规避......
每当Spring Data存储库与我的要求不匹配时,我就会从实体管理器直接进入Hibernate。
e.g。
entityManager.unwrap(Session.class).
createSQLQuery(SPECIAL_QUERY).
setTimestamp("requestTime", time).
setParameter("currency", String.valueOf(currency)).
setResultTransformer(
Transformers.aliasToBean(BookingSummary.class)
).list();
我有一些摘要,需要左外连接,所以无法将其映射回实体。