Ich habe einige JPA-Klassen und generieren Metamodell über org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
. Also einer meiner Klassen ist:JPA-Metamodellfelder sind null
@Table(name = "USER")
@Entity
@NamedQueries({@NamedQuery(name = "User.byLogin", query = "select u from User u where u.login = :login and u.active = :active")})
public class User implements Serializable {
@Column(name = "ID")
@Id
private Long id;
@Column(name = "LOGIN")
private String login;
@Column(name = "ACTIVE")
private Boolean active;
// etc..
}
Metamodel Prozessor generiert diese:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(User.class)
public abstract class User_ {
public static volatile SingularAttribute<User, Long> id;
public static volatile SingularAttribute<User, Boolean> active;
public static volatile SingularAttribute<User, String> login;
}
Dann gibt es den folgenden Code in meine Business-Logik-Klassen:
Map<String, Object> params = new HashMap<String, Object>();
params.put(User_.login.getName(), username);
params.put(User_.active.getName(), Boolean.TRUE);
userDao.executeNamedQuery("User.byLogin", params);
Dieser Code stürzt ab mit NPE in der zweiten Zeile. Ich habe durch Debugger bemerkt, dass User_
Felder alle null
sind. Die Frage ist also: Gibt es eine Möglichkeit, diese Felder zu initialisieren? Wie kann ich das machen?
P.S. Dies ist ein Legacy-Code, es funktionierte für lange Zeit, aber jetzt scheint es irgendwie kaputt zu sein.
JPA Metamodell verwendet wird in Criteria Abfragen nur gemeint, wie erklärt [hier] (https://docs.oracle.com/javaee/6/tutorial/doc/gjrij.html). Ich bin nicht sicher, ob es überhaupt in der Parameterkonstruktion einer benannten Abfrage verwendet werden kann. Beachten Sie auch, dass die Verwendung völlig anders ist als Ihre – perissf
@perissf ich verstehe. Das einzige, was ich nicht verstehe, ist, dass es irgendwie vorher funktioniert hat. Es gibt also große Mengen ähnlichen Legacy-Codes, und ich frage mich, ob es einen Weg gibt, es zu reparieren, ohne das alles neu zu schreiben. – Everv0id