java.sql.SQLException 对象名无效

Posted

技术标签:

【中文标题】java.sql.SQLException 对象名无效【英文标题】:java.sql.SQLException Invalid object name 【发布时间】:2018-05-24 07:21:16 【问题描述】:

当我尝试使用createQuery 从数据库中读取数据时出现以下错误,但如果我在entityManager 上使用createNativeQuery,我可以从数据库中读取数据。所以我猜我的entityManager 可以工作,但我的 Hibernate 配置有问题?

application.properties:

security.user.password=<password>
logging.level.org.springframework.security=DEBUG
spring.datasource.url=jdbc:jtds:sqlserver://localhost:60830;databaseName=<db>
spring.datasource.username=<user>
spring.datasource.password=<password>
spring.datasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.id.new_generator_mappings=false
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect
spring.jpa.database-platform=org.hibernate.dialect.SQLServerDialect

道:

package demo.dao;

import demo.entities.StampCard;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Transactional
@Repository
public class StampCardDAO implements IStampCardDAO 

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public StampCard getStampCard(int id) 
        //These rows works fine
        //Query query = entityManager.createNativeQuery("select userId from StampCard where StampCardID = '1'");
        //String userId = (String) query.getSingleResult();
        Query query = entityManager.createQuery("SELECT s FROM StampCard s WHERE s.stampCardID = '1'");
        StampCard stampCard = (StampCard) query.getSingleResult();
        return stampCard;
    

DAO 接口:

package demo.dao;

import demo.entities.StampCard;

public interface IStampCardDAO 

    StampCard getStampCard(int id);

实体:

package demo.entities;

import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
public class StampCard implements Serializable 

    private static final long serialVersionUID = 6602888822739626415L;

    private int stampCardID;
    @Getter @Setter private String createdDate;
    @Getter @Setter private String userID;
    @Getter @Setter private int numberOfStamps;

    @Id
    public int getStampCardID() 
        return stampCardID;
    

    public void setStampCardID(int stampCardID) 
        this.stampCardID = stampCardID;
    

    @Override 
    public boolean equals(Object obj) 
        if (obj == null) 
            return false;
        
        if (obj == this) 
            return true;
        
        if (obj.getClass() != getClass()) 
            return false;
        
        StampCard rhs = (StampCard) obj;
        return new EqualsBuilder().append(this.stampCardID, rhs.stampCardID).append(this.createdDate, rhs.createdDate).append(this.userID, rhs.userID)
                .append(this.numberOfStamps, rhs.numberOfStamps).isEquals();
    

    @Override 
    public int hashCode() 
        return new HashCodeBuilder().append(stampCardID).append(createdDate).append(userID).append(numberOfStamps).toHashCode();
    

数据库表:

CREATE TABLE [dbo].[StampCard](
    [StampCardID] [int] NOT NULL,
    [CreatedDate] [varchar](8) NOT NULL,
    [UserID] [varchar](255) NOT NULL,
    [NumberOfStamps] [int] NOT NULL,
 CONSTRAINT [PK_CardID] PRIMARY KEY CLUSTERED 
(
    [StampCardID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

数据库表内容:

StampCardID CreatedDate UserID  NumberOfStamps
1           20171208    USer    1

错误信息:

2017-12-10 18:04:09.837 WARN 37080 --- [restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:208,SQLState: S0002 2017-12-10 18:04:09.840 错误 37080 --- [restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper:无效的对象名称 'stamp_card'。

原因:java.sql.SQLException:无效的对象名称'stamp_card'。

感谢我能得到的所有帮助。

【问题讨论】:

【参考方案1】:

@Entity 带有 StampCard 类名称,hibernate 搜索名称为 Stamp_Card 的表

因此,如果您的表名只是 StampCard,请使用下面的表注释来指向您的表名。

@Entity
@Table(name = "STAMPCARD")

【讨论】:

【参考方案2】:

接受的答案有效。另一种解决方案是更改命名策略。 Springs 默认命名策略org.springframework.boot.orm.jpa.SpringNamingStrategy,用下划线分割驼峰式命名。通过在 application.properties 中添加 spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 来更改命名策略。那么@Table注解就不需要了,因为数据库表和实体类同名。

【讨论】:

【参考方案3】:

我遇到了类似的问题,但在我的情况下,根本原因是我连接到的数据库中的现有架构。

将以下行添加到配置(application.properties 文件)中,可以完全删除现有架构并创建通过我的应用程序定义的架构

spring.jpa.hibernate.ddl-auto = create-drop

这是 Naros 的回答,它帮助我更好地理解了“create-drop”属性: https://***.com/a/42147995/6110987

希望对你有帮助!

【讨论】:

【参考方案4】:

对于您看到该列不存在的情况。可能是因为在 DB 中,您的 Column 名称类似于 JiraNumber,因此在 @Table 注释以及 @Column 注释中以 UPPER CASE 写入参数名称的字符串值。

【讨论】:

以上是关于java.sql.SQLException 对象名无效的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:[Microsoft][ODBC Microsoft Access Driver] 无法更新。数据库或对象是只读的

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标