java - 将自定义命名/ native 查询映射到实体

标签 java spring hibernate jpa eclipselink

可以将自定义 native /命名查询映射到实体吗?我有这样的东西

NamedQueries({
    NamedQuery(name = "StateBo.findByCountry", query = "SELECT state FROM StateBo state WHERE state.country.id = ?"),
    NamedQuery(name = "StateBo.showIdfindByCountry", query = "SELECT state.id FROM StateBo state WHERE state.country.id = ?")
})
@Table(name = "STATE")
@Entity(name = "StateBo")
public class StateBo extends BaseNamedBo {

    private static final long serialVersionUID = 3687061742742506831L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STATE_ID")
    private Long id;

    @Column(name = "ISO_CODE")
    private String isoCode;

    @ManyToOne
    @JoinColumn(name = "COUNTRY_ID")
    private CountryBo country;

   // getters and setters ...
}

我有我的方法来调用像这样的 native /命名查询。

@Override
public List<E> executeQuery(String queryName, List<Object> criteria) {
TypedQuery<E> query = entityManager.createNamedQuery(queryName, entityClass);
Integer argumentPosition = 1;
if ( (criteria != null) && (criteria.size() > 0) ){
  for(Object object : criteria) {
    query.setParameter(argumentPosition, object);
    argumentPosition++;
  }
}
return (List<E>) query.getResultList();
}

当我调用 StateBo.findByCountry 时,结果会映射到 StateBo,但如果我调用 StateBo.showIdfindByCountry ,结果不会映射到 StateBo,因为我仅在查询中选择了 state.id,而不是表中的字段。

我不想选择 STATE 表的所有字段,在本例中我只需要 state.id,但是当我自定义 native 查询时,结果没有映射到StateBo而是这个,结果是Long类型。

我的问题是,是否可以将 StateBo.showIdfindByCountry 的结果映射到实体?如果我有更多字段,例如 state.isoCode,是否可以映射到 StateBo(自定义查询)?或者只有当我返回查询中的所有字段时才可能,例如第一个查询 StateBo.findByCountry

最佳答案

这是有可能的,但正如 JB Nizet 所说 - “你的同事将会因这样的设计决策而遭受损失”。

无论如何,为了做到这一点,您应该在实体类中创建自定义构造函数。此构造函数应接受 Long 参数并将其分配给实体类的 id 字段。

然后您应该更改查询以包含 NEW 关键字,后跟完整限定的实体类名称,如下所示:

SELECT NEW your.package.StateBo(sb.id)
FROM StateBo sb
WHERE state.country.id = ?

请注意,以这种方式从数据库检索的所有实体都不会由持久性上下文管理。

关于java - 将自定义命名/ native 查询映射到实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24593254/

相关文章:

java - 此位置不允许使用 Spring 注释 @Profile

java - 如何为基于 json 的插件设置 'docker plugin install'

java - 调用服务时连接超时 VS 读取超时

java - OnRetainCustomConfigurationInstance 之后所有编辑文本中的重复文本

java - 如何将堆栈跟踪错误放入记录器中

java - Spring Maven 构建 : invalid entry size (expected 2 but got 1 bytes)

java - 使用 for 循环和 spring mvc + hibernate 插入记录

spring - TransactionManager Spring 4 hibernate 4 NoSuchMethodError

java - Hibernate,一个具有不同列数的用户类型

java - 冒泡排序日历