java - 错误 java.sql.SQLException : Column 'id' not found

标签 java mysql hibernate spring-boot kotlin

执行查询计数 (*) 后,出现意外错误。我使用工作类图形界面满足了这个请求,一切都很好。在我的代码中,出现错误。我无法理解其中的原因。

这是执行我的数据库工作的实体管理器:

@PersistenceContext
    private val entityManager: EntityManager? = null

    fun count(request: HttpServletRequest): Int {
        val query = entityManager!!.createNativeQuery("SELECT COUNT(*) FROM resume r", Resume::class.java)
        return (query.getSingleResult() as Number).toInt()
    }

这是您需要获得的类(class)数量:

@Entity
@ValidWorkType
@ValidProfField
@ValidEducation
@ValidAddress
@ValidDescResume
data class Resume (

        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long? = null,

        @ManyToOne(fetch = FetchType.LAZY)
        var user: User? = null,

        var datecreate: LocalDateTime = LocalDateTime.now(),

        @get:Size(min = 1, max = 60, message = "{error.work.profession}")
        var profession: String? = null,

        @OneToOne(fetch = FetchType.LAZY, cascade = [CascadeType.ALL], orphanRemoval = true)
        @get:Valid
        var numberPhone: NumberPhone? = null,

        @get:Email(message = "{text.error.user.email}")
        @get:Size(min = 1, max = 100, message = "{text.error.user.email.size}")
        var email: String? = null,

        @ManyToOne(cascade = [CascadeType.MERGE])
        @get:NotNull(message = "{error.work.prof.field}")
        override var profField: ProfField? = null,

        @ManyToOne(cascade = [CascadeType.MERGE])
        @get:NotNull(message = "{error.work.work.type}")
        override var workType: WorkType? = null,

        @OneToOne(cascade = [CascadeType.ALL], orphanRemoval = true)
        @get:Valid
        var wage: Wage? = null,

        @ManyToOne
        override var education: Education? = null,

        var experience: Int? = null,

        @OneToOne(cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true)
        @get:Valid
        override var description: DescriptionResume? = null,

        @OneToOne(cascade = [CascadeType.ALL], orphanRemoval = true)
        override var address: Address? = null,

        @OneToOne(fetch = FetchType.LAZY, cascade = [CascadeType.ALL], orphanRemoval = true)
        var photo: ContainerSquareImages? = null,

        @OneToOne(cascade = [CascadeType.ALL], orphanRemoval = true)
        var views: Views = Views(),

        @Transient
        var rating: Int? = null

): ParentWorkType, ParentProfField, ParentEducation, ParentAddress, ParentDescResume {

        fun getPeriodExperience(): Period? {
                if (experience!=null) {
                        return Period.between(LocalDate.now(), LocalDate.now().plusDays(experience!!.toLong()))
                } else { return null }
        }

        override fun equals(other: Any?): Boolean {
                if (this === other) return true
                if (javaClass != other?.javaClass) return false

                other as Resume

                if (user != other.user) return false
                if (profession != other.profession) return false
                if (numberPhone != other.numberPhone) return false
                if (email != other.email) return false
                if (profField != other.profField) return false
                if (workType != other.workType) return false
                if (wage != other.wage) return false
                if (education != other.education) return false
                if (experience != other.experience) return false
                if (description != other.description) return false
                if (address != other.address) return false

                return true
        }

        override fun hashCode(): Int {
                var result = user?.hashCode() ?: 0
                result = 31 * result + (profession?.hashCode() ?: 0)
                result = 31 * result + (numberPhone?.hashCode() ?: 0)
                result = 31 * result + (email?.hashCode() ?: 0)
                result = 31 * result + (profField?.hashCode() ?: 0)
                result = 31 * result + (workType?.hashCode() ?: 0)
                result = 31 * result + (wage?.hashCode() ?: 0)
                result = 31 * result + (education?.hashCode() ?: 0)
                result = 31 * result + (experience?.hashCode() ?: 0)
                result = 31 * result + (description?.hashCode() ?: 0)
                result = 31 * result + (address?.hashCode() ?: 0)
                return result
        }

        fun getYearsCalendar() {

        }

        companion object {
                const val NAME_PARAM = "resume"
        }
}

这里的错误日志本身无法理解为什么,为什么,请帮忙:

Hibernate: SELECT COUNT(*) FROM resume r
[WARN ] 2019-07-01 00:37:08.485 [http-nio-8080-exec-1] SqlExceptionHelper - SQL Error: 0, SQLState: S0022
[ERROR] 2019-07-01 00:37:08.485 [http-nio-8080-exec-1] SqlExceptionHelper - Column 'id' not found.
[ERROR] 2019-07-01 00:37:08.525 [http-nio-8080-exec-1] [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query] with root cause
java.sql.SQLException: Column 'id' not found.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.result.ResultSetImpl.findColumn(ResultSetImpl.java:581) ~[mysql-connector-java-8.0.15.jar:8.0.15]
    at com.mysql.cj.jdbc.result.ResultSetImpl.getLong(ResultSetImpl.java:928) ~[mysql-connector-java-8.0.15.jar:8.0.15]

最佳答案

createNativeQuery 的文档内容如下:

Query createNativeQuery(String sqlString, Class resultClass)

sqlString - a native SQL query string

resultClass - the class of the resulting instance(s)

您的查询是:

SELECT COUNT(*) FROM resume r

这是访问 resume 表,但它返回一个 Integer - 而不是 resume 实例。这就是为什么您会收到未找到列“id”的信息。

修复方法只是将 Integer 作为结果类传递,因此:

val query =entityManager!!.createNativeQuery("SELECT COUNT(*) FROMresume r", Integer::class.java)

由于标量未映射,修复方法是不传递结果类,因此:

val query = entityManager!!.createNativeQuery("SELECT COUNT(*) FROM resume r")

关于java - 错误 java.sql.SQLException : Column 'id' not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56828254/

相关文章:

java - Hibernate Criteria - 从两个没有任何关联的表中获取结果

java - hibernate createQuery错误?

java - RSA解密打印NULL

java.util.Properties.load() 问题 OWASP Top 10 2017

mysql - MySQL 中的 Latin1_swedish_ci 编码

mysql - 如何根据用户 ID 的联系人表限制对我的查询行的访问

java - 转换现有的 spring 项目以使用 roo help

java - 您认为 Java 中最好的 CMS 是什么

java - 将依赖项下载到本地目录时,Maven 依赖项插件命令行选项可排除可选依赖项

mysql - 带日期的 SQL Count (*) 函数