Zapytanie nie zwraca wyników.

0

Witam. Piszę stronę, która ma mi umożliwić zalogowanie użytkownika.

W bazie danych mam tabelę admins:

CREATE  TABLE IF NOT EXISTS `ePrzychodnia`.`admins` (
  `id` INT NOT NULL ,
  `firstName` VARCHAR(45) NOT NULL ,
  `lastName` VARCHAR(45) NOT NULL ,
  `personalId` VARCHAR(11) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `personalId_UNIQUE` (`personalId` ASC) ,
  UNIQUE INDEX `password_UNIQUE` (`password` ASC) ) 

Klasę Admin, która mapuje tą tabelę.

@Entity
@Table(name = "admins")
@XmlRootElement
public class Admin implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "firstName")
    private String firstName;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "lastName")
    private String lastName;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 11)
    @Column(name = "personalId")
    private String personalId;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "password")
    private String password;

dalej jakieś gettery i settery 

ManagedBean JSF:

@ManagedBean
@RequestScoped
public class LoginMB {
    
    private static final String PERSISTENCE_UNIT_NAME = "ePrzychodnia-ejbPU";
    private static EntityManagerFactory factory;
    private String login;
    private String password;         

    /**
     * Creates a new instance of LoginMB
     */
    public LoginMB() {
    }

   Gettery i settery
    
    public String validate() {
        factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = factory.createEntityManager();
        Query q = em.createQuery("SELECT a FROM Admin a WHERE a.personalId = :login AND a.password = :password");
        q.setParameter("login", login);
        q.setParameter("password", password);
        try {
            Admin admin = (Admin) q.getSingleResult();
            if (login.equals(admin.getPersonalId()) && password.equals(admin.getPersonalId())) {
                return "success";
            }
        } catch (Exception e) {
            System.out.println("Błąd: " + e.getMessage());
            return null;
        }
        return "failed";
    }
} 

Strona logująca:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Logowanie</title>
    </h:head>
    <h:body>
        <h1>Logowanie</h1>
        <h:form>
            <h:panelGrid columns="3">
                <h:outputLabel value="Login"></h:outputLabel>
                <h:inputText id="login" value="#{loginMB.login}" label="Login">
                    <f:validateRequired/>	
                </h:inputText>
                <h:message for="login" style="color:red" />
                <h:outputLabel value="Password"></h:outputLabel>
                <h:inputSecret id="pass" value="#{loginMB.password}" label="Password">
                    <f:validateRequired/>	
                </h:inputSecret>
                <h:message for="pass" style="color:red" />
                <h:commandButton value="Logowanie" action="#{loginMB.validate()}"></h:commandButton>
            </h:panelGrid>
        </h:form>
    </h:body>
</html> 

Do tabeli w bazie danych dodałem następujący wpis:

 insert into admins values(1, 'admin', 'admin', '12345678901', 'admin');

Problem jest następujący. Na stronie mam ekran logowania wpisuję dane do logowania i niestety nic się nie dzieje, jest łapany wyjątek, bo funkcja validate zwraca null. W catch w tej metodzie dodałem System.out.println("Błąd: " + e.getMessage()); by sprawdzić co jest przyczyną. I dostaję coś takiego:

INFO: Błąd: getSingleResult() did not retrieve any entities.

Wnioskuję więc, że problem jest tutaj:

    public String validate() {
        factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = factory.createEntityManager();
        Query q = em.createQuery("SELECT a FROM Admin a WHERE a.personalId = :login AND a.password = :password");
        q.setParameter("login", login);
        q.setParameter("password", password);
        try {
            Admin admin = (Admin) q.getSingleResult();
            if (login.equals(admin.getPersonalId()) && password.equals(admin.getPersonalId())) {
                return "success";
            }
        } catch (Exception e) {
            System.out.println("Błąd: " + e.getMessage());
            return null;
        }
        return "failed";
    } 

w tej funkcji a dokładniej zapytanie nic nie zwraca mimo tego iż wpisuję poprawne dane konta wrzuconego do tabeli.
Czyżby zapytanie

Query q = em.createQuery("SELECT a FROM Admin a WHERE a.personalId = :login AND a.password = :password"); 

nic nie zwróciło? Wyjątek prawdopodobnie występuje w tym miejscu: Admin admin = (Admin) q.getSingleResult();

 bo dostaję coś takiego jak wyżej napisałem: 
> INFO: Błąd: getSingleResult() did not retrieve any entities.


Co zrobiłem źle? Bo ja już nie mam pojęcia proszę o pomoc, jeśli ktoś ma czas i chęci spojrzeć na powyższy kod.
1
select

używasz do tworzenia zapytań w funkcji createSQLQuery(String)

 U ciebie powinno być:
```java
Query q = em.createQuery("FROM Admin a WHERE a.personalId = :login AND a.password = :password");
0

Chyba to jednak nie to. Po zamianie a na * dostaję taki błąd na stronie:

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: Exception Description: Syntax error parsing the query [SELECT * FROM Admin a WHERE a.personalId = :login AND a.password = :password], line 1, column 7: unexpected token [*]. Internal Exception: NoViableAltException(93@[330 ( DISTINCT )?])

Ogólnie chyba te zapytania mają tak wyglądać, bo sam netbeans kiedy tworzyłem klasę Admin stworzył mi kilka gotowych zapytań i wyglądały one właśnie podobnie:

@Entity
@Table(name = "admins")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Admin.findAll", query = "SELECT a FROM Admin a"),
    @NamedQuery(name = "Admin.findById", query = "SELECT a FROM Admin a WHERE a.id = :id"),
    @NamedQuery(name = "Admin.findByFirstName", query = "SELECT a FROM Admin a WHERE a.firstName = :firstName"),
    @NamedQuery(name = "Admin.findByLastName", query = "SELECT a FROM Admin a WHERE a.lastName = :lastName"),
    @NamedQuery(name = "Admin.findByPersonalId", query = "SELECT a FROM Admin a WHERE a.personalId = :personalId"),
    @NamedQuery(name = "Admin.findByPassword", query = "SELECT a FROM Admin a WHERE a.password = :password")})
public class Admin implements Serializable { 
0

Edit: Poradziłem sobie z problemem.

Po pierwsze miałem literówkę w kodzie w bloku try:

(login.equals(admin.getPersonalId()) && password.equals(admin.getPersonalId()))

powinno być password.equals(admin.getPassword())

 dlatego też to logowanie często nie przechodziło. A problem z castem wyjaśnili mi na stackoverflow. Za pierwszym razem gdy uruchamiałem aplikację to nie dostawałem tego casta tylko <code class="java">getSingleResult() did not retrieve any entities.

a po jakichś drobnych zmianach zawsze, kiedy aplikacja była deployowana ponownie dostawałem tego casta. Ponieważ był jakiś problem z ładowaniem klasy. W takim przypadku podobno miał pomóc restart serwera i faktycznie tak jest. Po każdym ponownym deployu aplikacji należy zrestartować serwer by wszystko działało poprawnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1