Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将自定义命名/本机查询映射到实体_Java_Spring_Hibernate_Jpa_Eclipselink - Fatal编程技术网

Java 将自定义命名/本机查询映射到实体

Java 将自定义命名/本机查询映射到实体,java,spring,hibernate,jpa,eclipselink,Java,Spring,Hibernate,Jpa,Eclipselink,是否可以将自定义本机/命名查询映射到实体?我有类似的东西 NamedQueries({ NamedQuery(name = "StateBo.findByCountry", query = "SELECT state FROM StateBo state WHERE state.country.id = ?"), NamedQuery(name = "StateBo.showIdfindByCountry", query = "SELECT state.id FROM State

是否可以将自定义本机/命名查询映射到实体?我有类似的东西

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 ...
}
我有这样的方法来调用本机/命名查询

@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();
}
@覆盖
公共列表执行程序(字符串queryName,列表条件){
TypedQuery query=entityManager.createNamedQuery(queryName,entityClass);
整型参数位置=1;
如果((criteria!=null)&&(criteria.size()>0)){
用于(对象:标准){
query.setParameter(argumentPosition,object);
argumentPosition++;
}
}
return(List)query.getResultList();
}
调用StateBo.findByCountry时,结果映射到StateBo,但如果调用StateBo.showdindbycountry时,结果不会映射到StateBo,因为我只在查询中选择state.id,而不是表中的字段

我不想选择STATE表的所有字段,在本例中,我只想选择STATE.id,但是当我自定义本机查询时,结果不会映射到StateBo,而不是这个,结果是一个长类型


我的问题是,映射到实体是否可能是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 = ?

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

甚至不要考虑这样做。你和你的同事会因为这样的设计决定而痛苦。如果一个方法返回StateBo实例,调用方希望得到实际的、附加的StateBo实例。未分离的StateBo实例,其中所有字段均为null,所有不变量均已断开,因为它只包含一个ID。返回ID的方法应返回一个
列表
。返回ID/代码对的方法应返回
列表
。注意:与返回实体本身相比,返回实体的3个字段中的2个字段不会带来任何显著的性能优势。此外:您继续使用术语“本机查询”,但您的查询不是本机查询。本机查询是用SQL而不是JPQL编写的查询。谢谢,@JBNizet我的主要疑问是,如果返回一些字段而不是所有字段,会有助于提高性能,还是两种情况下的性能相同?请注意,返回实体的三分之二字段不会比返回实体本身带来任何显著的性能优势。