Ich dachte, der Ruhezustand berücksichtigt nur Klassenvariablen, die mit @Column
. Aber seltsamerweise wird heute, als ich eine Variable hinzufügte (die keiner Spalte zugeordnet ist, sondern nur eine Variable, die ich in der Klasse benötige), versucht, diese Variable in die select-Anweisung als Spaltennamen aufzunehmen, und der Fehler ausgegeben:
Unbekannte Spalte 'team1_.agencyName' in 'Feldliste'
Meine Klasse -
@Entity
@Table(name="team")
public class Team extends BaseObject implements Serializable {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(length=50)
private String name;
@Column(length=10)
private String code;
@Column(name = "agency_id")
private Long agencyId;
private String agencyName; //note: not annotated.
}
Zu Ihrer Information ... Ich verwende die obige Klasse in einer anderen Klasse mit vielen zu vielen Zuordnungen
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name="user_team",
joinColumns = { @JoinColumn( name="user_id") },
inverseJoinColumns = @JoinColumn( name="team_id")
)
public Set<Team> getTeams() {
return teams;
}
Warum passiert dies?!
JPA verwendet all Eigenschaften der Klasse, es sei denn, Sie markieren sie ausdrücklich mit @Transient
:
@Transient
private String agencyName;
Das @Column
Annotation ist rein optional und dient dazu, den automatisch generierten Spaltennamen zu überschreiben. Darüber hinaus ist das length
-Attribut von @Column
wird nur verwendet, wenn Tabellendefinitionen automatisch generiert werden. Dies hat keine Auswirkungen auf die Laufzeit.
Eine weitere mögliche Ursache für dieses Problem ist der Import der falschen Paketversion von @Transient
. Stellen Sie sicher, dass Sie javax.persistence.transient
Und kein anderes Paket importieren.
Das Platzieren von @Transient
Auf Getter mit privatem Feld hat für mich funktioniert.
private String name;
@Transient
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}