hgu*_*ser 11 java orm hibernate jpa jpql
我有一个实体,我使用它ColumnTransformer来进行绑定和提取值:
@Entity
class BPoint {
@Id
private Integer id;
@ColumnTransformer(read = "astext(shape)", write = "toshape(?)")
private Shape shape;
}
Run Code Online (Sandbox Code Playgroud)
道:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
它工作,但是一旦我必须做一些需要使用sql函数的查询,我遇到一些问题,以这个有效的本机sql为例:
select * from BPoint h where inside(h.shape, 100) = 1;
Run Code Online (Sandbox Code Playgroud)
首先我尝试使用这样的hql:
Query q = em.createNativeQuery("select astext(shape) from BPoint h where inside(h.shape, ?) = 1");
Run Code Online (Sandbox Code Playgroud)
但是我发现生成的sql包含了类似的东西
...... where inside(astext(h.shape),100).....
似乎该ColumnTransformer read值在sql函数中使用,inside这是不期望的.
所以我尝试使用这样的本机SQL查询:
Query q = em.createNativeQuery("select * from BPoint h where inside(h.shape, ? = 1");
Run Code Online (Sandbox Code Playgroud)
不能执行sql,但无法正确映射结果.
然后我必须select fileds像这样添加manualy:
Query q = em.createNativeQuery("select id,astext(shape) from BPoint h where inside(h.shape, ? = 1");
Run Code Online (Sandbox Code Playgroud)
但是,如果我的实体有很多文件说它超过20?如果一些列名称改变了怎么样?
有没有其他方法可以满足我的要求?
首先尝试为您的本机查询提供返回类型:
Query q = em.createNativeQuery("select * from BPoint h where inside(h.shape, ? = 1", BPoint.clss);
List<BPoint> result = q.getResultList();
Run Code Online (Sandbox Code Playgroud)
或者你可以尝试这样做:
Session session = em.unwrap(Session.class);
List<BPoint> points = (List<BPoint>) session.createSQLQuery("SELECT {h.*} FROM BPoint {h} WHERE inside({h}.shape, ? = 1")
.addEntity("h", BPoint.class)
.list();
Run Code Online (Sandbox Code Playgroud)
Hibernate 特定的 API 允许您将本机查询结果映射到实体。
| 归档时间: |
|
| 查看次数: |
3154 次 |
| 最近记录: |