【发布时间】:2015-04-28 14:47:21
【问题描述】:
我有一个实体,我使用ColumnTransformer 来绑定和提取值:
@Entity
class BPoint {
@Id
private Integer id;
@ColumnTransformer(read = "astext(shape)", write = "toshape(?)")
private Shape shape;
}
还有道:
class BPointDao {
@Autowired
private EntityManager em;
@Override
public Page<BPoint> findAll(Pageable pageable) {
Query q = em.createQuery("from BPoint");
List<BPoint> r = q.getResultList();
int total = em.createQuery("select count(*) from BPoint").getFirstResult();
return new PageImpl(r, pageable, total);
}
@Override
public Integer save(BPoint hbds) {
em.persist(hbds);
return hbds.getId();
}
}
它可以工作,但是一旦我必须做一些需要使用 sql 函数的查询,我就会遇到一些问题,以这个有效的本机 sql 为例:
select * from BPoint h where inside(h.shape, 100) = 1;
首先我尝试像这样使用 hql:
Query q = em.createNativeQuery("select astext(shape) from BPoint h where inside(h.shape, ?) = 1");
但是我发现生成的sql包含类似
的东西...... where inside(astext(h.shape),100).....
在sql函数inside中似乎使用了ColumnTransformer read值,这不是预期的。
所以我尝试像这样使用本机 sql 查询:
Query q = em.createNativeQuery("select * from BPoint h where inside(h.shape, ? = 1");
不是sql可以执行,但是结果不能正确映射。
然后我必须像这样手动添加select fileds:
Query q = em.createNativeQuery("select id,astext(shape) from BPoint h where inside(h.shape, ? = 1");
但是如果我的实体有很多文件说它超过 20 个呢?如果某些列名称更改了怎么办?
是否有其他方法可以满足我的要求?
【问题讨论】:
-
你为什么不尝试使用
ResultTransformer执行本机sql和映射结果 -
我目前使用的是原生 sql,但是我必须手动计算 sql 中的文件,因为该表包含近 100 多列。
-
你说native sql可以执行,但是结果不能正确映射。如果你写一个
ResultTransformer来映射它会怎样
标签: java hibernate jpa orm jpql