2

休止状態で更新クエリを書くとき。このエラーが発生しています。MySQL 5.0 で Hibernate 3.2 を使用しています。ここで UserDetails.java では、Login は Login.java の主キー (loginId) を参照する外部キーです。

java.lang.NullPointerException
    at org.hibernate.hql.ast.util.SessionFactoryHelper.findSQLFunction(SessionFactoryHelper.java:342)
    at org.hibernate.hql.ast.tree.IdentNode.getDataType(IdentNode.java:266)
    at org.hibernate.hql.ast.tree.BinaryLogicOperatorNode.extractDataType(BinaryLogicOperatorNode.java:168)
    at org.hibernate.hql.ast.tree.BinaryLogicOperatorNode.initialize(BinaryLogicOperatorNode.java:34)
    at org.hibernate.hql.ast.HqlSqlWalker.prepareLogicOperator(HqlSqlWalker.java:1007)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3992)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1762)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:776)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.updateStatement(HqlSqlBaseWalker.java:358)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:237)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)

ここにサービスクラスがあります

 Date birthDay = formatter1.parse(brthDay);
        session = HibernateUtil.getSession();
        transaction = session.beginTransaction();
        Login login = (Login) session.get(Login.class, loginId);
        Query query2 = session.createQuery("update UserDetails set name=:Name, secEmailId=:SecEmailId, dob=:DOB, gender=:Gender  where Login=:LoginId");
        query2.setString("Name", name);
        query2.setString("SecEmailId", secEmailId);
        query2.setDate("DOB", birthDay);
        query2.setString("Gender", gender);
        query2.setParameter("LoginId", login);
        profileUpdated = query2.executeUpdate();

ここに UserDetails.java pojo クラスがあります

private Long udid;
private Login login;
private String name;
private String secEmailId;
private Date dob;
private String gender;
private long createrId;
private Date createdDate;
private long updaterId;
private Date updatedDate;
settes & getters
4

1 に答える 1

0

エンティティには Login オブジェクトしかありません。外部キーの呼び出しは、HQL に入れる (Integer または int) でなければなりません。また、hibernate では HQL でブラケットを使用できないため、login.getId() として外部キーを呼び出すことはできません。Integer を使用する目的は、null に設定できるようにすることです。

private Login login;

エンティティを参照する必要がありますが、データベースからロードしたくなく、外部キーを取得するためだけに、このアプローチを使用します。ただし、エンティティへの正しい参照が失われないように、 @Column 属性に "insertable"=false および "updatable"=false を追加する必要があります。おそらく、これは UserDetails クラスです。

@Entity
public class UserDetails {

    //Other attributes, id, phNo, address, etc..

    @Column(name = "full_name")
    private String name;

    @OneToMany(cascade = CascadeType.ALL) //Relationship is up to you.
    @JoinColumn(name = "login_id")
    private Login login; //This is object.

    @Column(name = "login_id", insertable = false, updatable = false)
    private Integer fkLoginId; //Here is your foreign key.

    //getter and setters.
}

挿入または更新できず、列を参照しているだけなので、データベースに別の列は生成されません。その後、外部キーとして fkLoginId を取得し、次のように HQL を使用して UserDetails を更新します。

String name = "Updated Name";
int id = 1;

session = HibernateUtil.getSession(); //Consider declared
transaction = session.beginTransaction();
Login login = (Login) session.get(Login.class, loginId);
String hql = "update UserDetails set name=:Name where fkLoginId=:Id"; //<---Ans
Query query = session.createQuery(hql);
query.setParameter("Name", name);
query.setParameter("Id", id);
int result = query.executeUpdate();
transaction.commit();
session.close();

それが役に立てば幸い。

于 2019-07-20T19:19:09.520 に答える