J'utilise JPA pour l'accès à la base de données et annoté chaque colonne avec le nom correct. Maintenant, si j'exécute une requête (par exemple findAll()
), elle renvoie
Unknown column 'program0_.program_id' in 'field list'
Le message d'erreur est correct program_id
Est inconnu car le vrai nom est programId
.
Modèles: Programme
@Entity
@Table(name = "programs")
@XmlRootElement
public class Program implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "programId")
private Long programId;
@ManyToMany
@JoinTable(
name = "programlabels",
joinColumns = {
@JoinColumn(name = "program", referencedColumnName = "programId")},
inverseJoinColumns = {
@JoinColumn(name = "label", referencedColumnName = "labelId")})
private Collection<Label> labels;
}
Étiquette
@Entity
@Table(name = "labels")
@XmlRootElement
public class Label implements Serializable {
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "labelId")
private String labelId;
}
Requête
select program0_.program_id as program_1_5_, ...
Y a-t-il une raison pour laquelle JPA change "programId" en "program_id" ou est-ce qu'il me manque une configuration?
merci
Modifier: Oh désolé, j'ai oublié d'ajouter le code de requête/les informations.
J'utilise l'interface JpaRepository
de Spring Data et j'ai essayé la requête findAll()
.
@Repository
public interface ProgramRepository extends JpaRepository<Program, Long> {}
Comme décrit dans spring-boot-jpa-column-name-annotation-ignored , le nom de votre colonne est converti en cas de serpent.
Solutions possibles:
http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
spring.jpa.hibernate.naming.strategy n'est pas une propriété prise en charge pour l'implémentation Spring JPA avec Hibernate 5.
Utilisez la propriété ci-dessous dans application.properties
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
@ Colonne (name = "PersonFullName")
chaîne privée PersonFullName;
au nom de colonne de la table de base de données " PersonFullName " sans le soulignement.
Ce qui suit a fonctionné pour moi. Ajoutez-le dans les paramètres de l'application, puis utilisez @Column pour spécifier le nom de colonne de la base de données physique pour la propriété du modèle.
@ Colonne (name = "PersonFullName")
Dans Application.properties
spring.jpa.hibernate.naming.implicit-strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl