Après avoir exécuté le nombre de requêtes (*), j'obtiens une erreur inattendue. J'ai répondu à cette demande en utilisant une interface graphique workbanch, tout va bien là-bas. Dans mon code, une erreur se produit. Je ne comprends pas la raison.
Voici le gestionnaire d'entités qui effectue mon travail avec la base de données:
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]
Il s'agit d'une classe dont vous avez besoin pour obtenir :
@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"
}
}
Voici le journal des erreurs lui-même ne peut pas comprendre pourquoi, et pourquoi, s'il vous plaît aider:
@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()
}
3 Réponses :
La documentation de createNativeQuery lit:
Requête createNativeQuery (String sqlString, Classe résultatClasse)
sqlString - une chaîne de requête SQL native
resultClass - la classe des instances résultantes
Votre requête est:
val query = entityManager!!.createNativeQuery("SELECT COUNT(*) FROM resume r")
Cela accède à la table CV , mais elle renvoie un entier - pas un instance de reprise . C'est pourquoi vous obtenez le Colonne 'id' introuvable. .
Le correctif consiste simplement à passer Integer comme classe de résultat, donc:
val query = entityManager !!. createNativeQuery ("SELECT COUNT (*) FROM resume r", Integer :: class.java)
Puisque les scalaires ne sont pas mappés, le correctif est de pas passer une classe de résultat, donc:
SELECT COUNT(*) FROM resume r
ne fonctionne pas - org.hibernate.MappingException: entité inconnue: java.lang.Integer
Toutes mes excuses, les scalaires ne sont pas mappés, donc aucune classe de mappage ne doit être transmise. J'ai mis à jour la réponse.
Avec l'interface JPA javax.persistence.Query: choisissez NamedQuery ou TypedQuery
Example
@javax.persistence.NamedQuery(
name="resumeCountTest", query = "SELECT COUNT(*) FROM resume r")
public class Resume {
-------------
Query query = entityManager.createNamedQuery("resumeCountTest");
long resumeCount = query.getSingleResult();
return resumeCount ;
Plus d'informations Exécution de requêtes JPA
besoin de créer une requête dynamique
Résolution du problème en utilisant JPQL:
@PersistenceContext
private val entityManager: EntityManager? = null
fun count(request: HttpServletRequest): Long {
val query = entityManager!!.createQuery("SELECT COUNT(resume.id) FROM Resume resume")
return query.singleResult as Long
}
Obtenez-vous cette erreur sans le décompte. Ce qui signifie juste un plan tout sélectionner. Ou essayez de mettre un seul champ dans la déclaration de décompte.
Activez la journalisation SQL pour Hibernate et affichez l'instruction exécutée.