使用JPA本机查询时,是否必须选择所有实体属性?

丹尼

对于某些复杂的业务逻辑,我需要使用JPA本机查询(使用Hibernate),并且我发现显然所有实体属性都需要在本机查询的SELECT子句中。否则,JPA总是抛出

java.sql.SQLException: Column 'xxx' not found.

所以我想知道这是否是必需的,还是因为我找不到任何JPA规范对此而在我的代码/配置中遗漏了什么。我的代码如下:

表架构

CREATE TABLE `casaddress` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`addressLine1` varchar(255) DEFAULT NULL,
`addressLine2` varchar(255) DEFAULT NULL,
`companyId` bigint(20) DEFAULT NULL,
`country` varchar(255) DEFAULT NULL,
`effectiveDate` date DEFAULT NULL,
`occupiedOfficer` varchar(255) DEFAULT NULL,
`postcode` varchar(255) DEFAULT NULL,
`suburb` varchar(255) DEFAULT NULL,
`type` int(11) DEFAULT NULL,
`version` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK616A8A7F1FD01BA8` (`companyId`),
CONSTRAINT `FK616A8A7F1FD01BA8` FOREIGN KEY (`companyId`) REFERENCES `cascompany` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1

JPA实体代码(仅是pojo)

@Entity(name = "CASAddress")
    public class Address implements Serializable {

    private static final long serialVersionUID = -2903861598526729415L;

    public static final String TYPE = "type";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Version
    private Long version;

    private String addressLine1;

    private String addressLine2;

    private String suburb;

    private String postcode;

    private String country;

    private String occupiedOfficer;

    @Temporal(value = TemporalType.DATE)
    private Date effectiveDate;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId", nullable = false, updatable = false, insertable = false)
    private CASCompany company;

    private Long companyId;

    private AddressType type;

    public Address() {

  }

  /**
   * @return the addressLine1
   */
  public String getAddressLine1() {
    return addressLine1;
  }

  /**
   * @param addressLine1 the addressLine1 to set
   */
  public void setAddressLine1(String addressLine1) {
    this.addressLine1 = addressLine1;
  }

  /**
   * @return the addressLine2
   */
  public String getAddressLine2() {
    return addressLine2;
  }

  /**
   * @param addressLine2 the addressLine2 to set
   */
  public void setAddressLine2(String addressLine2) {
    this.addressLine2 = addressLine2;
  }

  /**
   * @return the suburb
   */
  public String getSuburb() {
    return suburb;
  }

  /**
   * @param suburb the suburb to set
   */
  public void setSuburb(String suburb) {
    this.suburb = suburb;
  }

  /**
   * @return the postcode
   */
  public String getPostcode() {
    return postcode;
  }

  /**
   * @param postcode the postcode to set
   */
  public void setPostcode(String postcode) {
    this.postcode = postcode;
  }

  /**
   * @return the country
   */
  public String getCountry() {
    return country;
  }

  /**
   * @param country the country to set
   */
  public void setCountry(String country) {
    this.country = country;
  }

  /**
   * @return the occupiedOfficer
   */
  public String getOccupiedOfficer() {
    return occupiedOfficer;
  }

  /**
   * @param occupiedOfficer the occupiedOfficer to set
   */
  public void setOccupiedOfficer(String occupiedOfficer) {
    this.occupiedOfficer = occupiedOfficer;
  }

  /**
   * @return the effectiveDate
   */
  public Date getEffectiveDate() {
    return effectiveDate;
  }

  /**
   * @param effectiveDate the effectiveDate to set
   */
  public void setEffectiveDate(Date effectiveDate) {
    this.effectiveDate = effectiveDate;
  }

  /**
   * @return the companyId
   */
  public Long getCompanyId() {
    return companyId;
  }

  /**
   * @param companyId the companyId to set
   */
  public void setCompanyId(Long companyId) {
    this.companyId = companyId;
  }

  /**
   * @return the type
   */
  public AddressType getType() {
    return type;
  }

  /**
   * @param type the type to set
   */
  public void setType(AddressType type) {
    this.type = type;
  }
}

和查询代码(只是一个容易显示问题的代码。实际查询非常复杂):

String query =
    "SELECT ad.id, ad.version, ad.addressLine1, ad.addressLine2, ad.suburb, ad.country, 
    ad.postcode, ad.type, ad.companyId, ad.effectiveDate from CASAddress ad";
    Query q = entityManager.createNativeQuery(query, Address.class);
   List<Address> addresses = q.getResultList();

请注意,没有在SELECT子句中添加Address实体的被占用的Officer属性,并且我得到了

Caused by: org.hibernate.exception.SQLGrammarException: Column 'occupiedOfficer' not found.
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:108)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at com.sun.proxy.$Proxy198.getString(Unknown Source)
    at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:66)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:65)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:332)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2873)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1668)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1600)
    at org.hibernate.loader.Loader.getRow(Loader.java:1500)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:712)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:940)
    at org.hibernate.loader.Loader.doQuery(Loader.java:910)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
    at org.hibernate.loader.Loader.doList(Loader.java:2516)
    at org.hibernate.loader.Loader.doList(Loader.java:2502)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332)
    at org.hibernate.loader.Loader.list(Loader.java:2327)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338)
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1783)
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:231)
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:157)
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:264)
    ... 79 more
Caused by: java.sql.SQLException: Column 'occupiedOfficer' not found.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1163)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5729)
    at com.alibaba.druid.filter.FilterChainImpl.resultSet_getString(FilterChainImpl.java:811)
    at com.alibaba.druid.filter.FilterAdapter.resultSet_getString(FilterAdapter.java:1754)
    at com.alibaba.druid.filter.FilterChainImpl.resultSet_getString(FilterChainImpl.java:809)
    at com.alibaba.druid.filter.FilterAdapter.resultSet_getString(FilterAdapter.java:1754)
    at com.alibaba.druid.filter.FilterChainImpl.resultSet_getString(FilterChainImpl.java:809)
    at com.alibaba.druid.filter.stat.StatFilter.resultSet_getString(StatFilter.java:930)
    at com.alibaba.druid.filter.FilterChainImpl.resultSet_getString(FilterChainImpl.java:809)
    at com.alibaba.druid.proxy.jdbc.ResultSetProxyImpl.getString(ResultSetProxyImpl.java:693)
    at com.alibaba.druid.pool.DruidPooledResultSet.getString(DruidPooledResultSet.java:257)
    at sun.reflect.GeneratedMethodAccessor66.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:104)
    ... 104 more

如果我添加了占用的Officer属性(不需要),则查询有效并返回正确的结果。有什么想法吗?

史蒂夫·C

§3.10.16.1JPA规范的“从本地查询返回托管实体”说:

当要从本机查询返回实体时,SQL语句应选择所有映射到该实体对象的列。这应该包括相关实体的外键列。当没有足够的数据可用时获得的结果是不确定的。

换句话说,JPA不支持来自本地查询的部分实体填充(如果有的话)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在LINQ查询中使用“包含”时,检查List是否不为空,否则选择所有记录

来自分类Dev

在使用innodb的mysql中选择* FOR UPDATE时,它是否锁定所有与查询匹配的结果?

来自分类Dev

使用DMQL2查询RETS服务器时,是否可以获取具有属性的所有照片位置?

来自分类Dev

使用JPA本机查询与MemSql选择JSON列

来自分类Dev

使用实体框架时是否必须使用Linq?

来自分类Dev

是否必须在所有类中使用Kivy属性?

来自分类Dev

JPA 本机查询结果集映射到具有子类的实体类

来自分类Dev

当您只选择最后 N 个时,查询是否会遍历所有数据?

来自分类Dev

使用索引时,范围是否必须计算所有先前的值

来自分类Dev

Cassandra配置-是否在所有群集节点上都必须进行本机传输?

来自分类Dev

在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

来自分类Dev

在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

来自分类Dev

休眠命名查询(选择未在其他实体中出现的所有实体实例)

来自分类Dev

使用 value 属性选择所有输入

来自分类Dev

对所有实体使用全局查询过滤器

来自分类Dev

使用Doctrine查询构建器获取所有订购的实体

来自分类Dev

从连接实体中选择“ Doctrine 2本机查询”

来自分类Dev

JPA实体和查询的编译时检查

来自分类Dev

使用spring数据jpa和rest时,防止hibernate在启动时生成所有查询计划

来自分类Dev

是否可以使用select(mtcars,wt :)从wt到结束时选择所有变量?

来自分类Dev

使用无代理异常监视时,是否所有客户端/主机都必须位于同一域上?

来自分类Dev

在Android中为文件夹使用资源限定符时,我是否必须提供所有新资源?

来自分类Dev

如何使用Hibernate Query Language查询所有具有关联实体的实体?

来自分类Dev

子实体联合上的Hibernate JPA @Inheritance TABLE_PER_CLASS JpaRepository选择所有表

来自分类Dev

我们是否可以像属性文件一样在一处定义所有命名查询,而不用编写实体类

来自分类Dev

在 JPA 中,如何找到具有属性值的所有类型和具有属性值的 ManyTomany 相关实体?

来自分类Dev

AppEngine数据存储区查询具有给定属性的所有实体(Java)

来自分类Dev

AppEngine数据存储区查询具有给定属性的所有实体(Java)

来自分类Dev

使用concat()时,JPA本机查询返回字节数组而不是字符串

Related 相关文章

  1. 1

    在LINQ查询中使用“包含”时,检查List是否不为空,否则选择所有记录

  2. 2

    在使用innodb的mysql中选择* FOR UPDATE时,它是否锁定所有与查询匹配的结果?

  3. 3

    使用DMQL2查询RETS服务器时,是否可以获取具有属性的所有照片位置?

  4. 4

    使用JPA本机查询与MemSql选择JSON列

  5. 5

    使用实体框架时是否必须使用Linq?

  6. 6

    是否必须在所有类中使用Kivy属性?

  7. 7

    JPA 本机查询结果集映射到具有子类的实体类

  8. 8

    当您只选择最后 N 个时,查询是否会遍历所有数据?

  9. 9

    使用索引时,范围是否必须计算所有先前的值

  10. 10

    Cassandra配置-是否在所有群集节点上都必须进行本机传输?

  11. 11

    在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

  12. 12

    在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

  13. 13

    休眠命名查询(选择未在其他实体中出现的所有实体实例)

  14. 14

    使用 value 属性选择所有输入

  15. 15

    对所有实体使用全局查询过滤器

  16. 16

    使用Doctrine查询构建器获取所有订购的实体

  17. 17

    从连接实体中选择“ Doctrine 2本机查询”

  18. 18

    JPA实体和查询的编译时检查

  19. 19

    使用spring数据jpa和rest时,防止hibernate在启动时生成所有查询计划

  20. 20

    是否可以使用select(mtcars,wt :)从wt到结束时选择所有变量?

  21. 21

    使用无代理异常监视时,是否所有客户端/主机都必须位于同一域上?

  22. 22

    在Android中为文件夹使用资源限定符时,我是否必须提供所有新资源?

  23. 23

    如何使用Hibernate Query Language查询所有具有关联实体的实体?

  24. 24

    子实体联合上的Hibernate JPA @Inheritance TABLE_PER_CLASS JpaRepository选择所有表

  25. 25

    我们是否可以像属性文件一样在一处定义所有命名查询,而不用编写实体类

  26. 26

    在 JPA 中,如何找到具有属性值的所有类型和具有属性值的 ManyTomany 相关实体?

  27. 27

    AppEngine数据存储区查询具有给定属性的所有实体(Java)

  28. 28

    AppEngine数据存储区查询具有给定属性的所有实体(Java)

  29. 29

    使用concat()时,JPA本机查询返回字节数组而不是字符串

热门标签

归档