我有一些JPA类,并通过org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
生成元模型。因此,我的课程之一是:
@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..
}
元模型处理器生成以下代码:
@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;
}
然后,在我的业务逻辑类中有以下代码:
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);
此代码在第二行上的NPE崩溃。我通过调试器注意到
User_
字段都是null
。因此,问题是:有没有办法初始化这些字段?我怎样才能做到这一点?附言这是一个遗留代码,可以长时间正常工作,但是现在似乎已经以某种方式被破坏了。
最佳答案
JPA元模型的参数值应该为空。从我得到的结果来看,不可能从User_.login.getName()
获取包含名称的字符串,因为User_.login
不存在(从未初始化)。 User_
是抽象类,并且这些值无法初始化。从元模型中获取变量名称的唯一方法是获取所有变量。我正在使用以下程序
public class EntityReader {
public static<T> String[] getArguments(Class<T> classToRead){
Field[] fields = classToRead.getFields();
String[] result = new String[fields.length];
for (int i = 0; i < fields.length; i++) result[i] = fields[i].getName();
return result;
}
}