gpt4 book ai didi

java - hibernate 中的 ColumnTransformer

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:51 25 4
gpt4 key购买 nike

我有一个实体,我使用 ColumnTransformer 来绑定(bind)和提取值:

@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 函数的查询,我遇到了一些问题,以这个有效的 native 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包含类似

的东西

......里面(astext(h.shape),100)......

似乎 ColumnTransformer read 值在 sql 函数 inside 中使用,这不是预期的。

所以我尝试像这样使用 native 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 个怎么办?如果某些列的名称更改了怎么办?

是否有其他方法可以满足我的要求?

最佳答案

首先尝试为您的原生查询提供返回类型:

Query q = em.createNativeQuery("select * from BPoint h where inside(h.shape, ? = 1", BPoint.clss);
List<BPoint> result = q.getResultList();

或者你可以尝试这样做:

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();

Hibernate 特定的 API 允许您将 native 查询结果映射到实体。

关于java - hibernate 中的 ColumnTransformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28738830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com