可以将自定义本机/命名查询映射到实体吗?我有类似的东西
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 / Named查询。
@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 ,但是当我自定义我的时候原生查询,结果未映射到 StateBo 而不是这个,结果是Long类型。
我的问题是,是否可以将实体映射到 StateBo.showIdfindByCountry 的结果?我的情况是我有更多像state.isoCode这样的字段,可能映射到StateBo,自定义查询?或者只有在我从查询中返回所有字段时才可以,例如第一个查询 StateBo.findByCountry
答案 0 :(得分:0)
有可能,但正如JB Nizet所说 - “你的同事会受到这样的设计决定”。
无论如何,为了做到这一点,你应该在你的实体类中创建自定义构造函数。此构造函数应接受Long
参数并将其分配给实体类的id
字段。
然后,您应该将查询更改为包含NEW
关键字,后跟完整限定的实体类名称,如下所示:
SELECT NEW your.package.StateBo(sb.id)
FROM StateBo sb
WHERE state.country.id = ?
请注意,以这种方式从数据库中检索的所有实体都不会由持久性上下文管理。