0

テキストフィールドがあるフォームがあります。ユーザーがテキスト フィールドに電子メール アドレスを入力し、ユーザーがフォームを送信すると、クラスはテーブルからユーザーの をAction見つけて、JSP ページに を含むメッセージとして表示します。を取得しています。uidUsersuid<s:actionmessage/>IndexOutOfBoundsException

私のJSPフォームは次のとおりです。

<s:form action="okadddqs" method="post" cssClass="text">

   <s:textfield label="Your Email address " name="email"/>
   <s:submit value="Find Uid"/>
 </s:form>

Actionクラスのコードは次のとおりです。

package com.rambo.action;

import beans.Users;
import com.opensymphony.xwork2.ActionSupport;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.hibernate.Session;

/**
 *
 * @author ROMO
 */
@ManagedBean
@SessionScoped
public class NewQuestion extends ActionSupport {

    private String email;

    private List<Users> ul = new ArrayList<Users>();

    public List<Users> getUl() {
        return ul;
    }

    public void setUl(List<Users> ul) {
        this.ul = ul;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
/* i have used many where the getUid() and getEmail() even in the error and messages to find what the value it is getting on error.  */
    @Override
    public String execute() throws Exception {
        Session session = null;
        int d;
        try {
            session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            try {
                ul = (List<Users>) session.createQuery("from Users c where c.email = '" + getEmail() + "'");
                if (!ul.isEmpty()) {
                    d = ul.get(0).getUid();
                } else {
                    this.addActionError("Oops. Sorry. You are Not Allowed now. Please Try Again Later." + getEmail() + ","+ ul.get(0).getUid());
                    session.close();
                    return ERROR;
                }
            } catch (Exception e) {
                this.addActionError("Oops. There was an error." + getEmail() + ","+ ul.get(0).getUid());
                session.close();
                return ERROR;
            }
            session.getTransaction().commit();
        } catch (Exception e) {
            this.addActionError("Oops. An Error Encountered...! Email address " + getEmail() + ","+ ul.get(0).getUid()+" not registered. Try with your new email address.");
            session.close();
            return ERROR;
        }
        this.addActionMessage("Your Uid is : " + ul.get(0).getUid());
        return SUCCESS;
    }

   @Override
    public void validate() {
       if ( "".equals(getEmail()) || getEmail() == null ) {
            this.addActionError("Email is Compulsory to input..!" + getCname());
        } else if (getEmail().indexOf("@") < 0 || getEmail().indexOf(",") > 0 || getEmail().indexOf(".") < 0 || lastEmailFieldTwoCharsOrMore(getEmail()) == false) {
            this.addActionError("Please Input a valid email address." + getCname());
        }
    }
}

すべての try catch ブロックを削除すると、次のような例外が発生します。

java.lang.ClassCastException: org.hibernate.impl.QueryImpl cannot be cast to java.util.List

POJOを使用して、Beanとテーブルのマッピングを適切に行いました。誰かがエラーを指摘できますか? Struts で Hibernate を使用しています。

4

1 に答える 1

2

コードの次の行が正しくありません。

ul = (List<Users>) session.createQuery(
    "from Users c where c.email = '" + getEmail() + "'"
);

createQueryはクエリオブジェクトを返します。そのクエリの結果が必要な場合は、Query.list()を使用します。

ul = (List<Users>) session.createQuery(
    "from Users c where c.email = '" + getEmail() + "'"
).list();
于 2012-07-14T05:09:25.533 に答える