2016-07-26 7 views
2

ich HQL Abfrage zu schreiben versuche die aktuelle Sitzung eines Benutzers mit diesem AnsatzAbrufen der aktuellen Benutzer-ID in einer Sitzung eines Benutzers mithilfe von _sessionFactory.getCurrentSession(); Hibernate

@Autowired 
    private SessionFactory _sessionFactory; 

    private Session getSession() { 
     return _sessionFactory.getCurrentSession(); 
    } 

Ich versuche, so etwas wie dieses

return getSession().createQuery("SELECT FROM Users u WHERE u.id = :userIdFromSession AND u.isAdmin = true").list(); 

das ist mein Ansatz abrufen

zu erreichen
return getSession().createQuery("SELECT FROM Users u WHERE u.id = " +:getSession() +"AND u.isAdmin = true").list(); 

unter der Annahme, dass die Getter und Setter vorhanden sind, ist dies die Benutzerentitätsklasse

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "userId") 
    private Long id; 
    @Column(nullable = false) 
    private String name; 
    @Column(unique = true, nullable = false) 
    private String email; 
    @Column(nullable = false) 
    private long timestamp; 

    @OneToOne 
    @JoinColumn(name = "adminId",nullable = false) 
    Admin admin; 

    @Column(nullable = true) 
    private boolean isAdmin; 

unter der Annahme, Getter und Setter, ist dies die Chat Entitätsklasse

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "chatId") 
    private Long id; 
    private String message; 

    @OneToOne 
    @JoinColumn(name = "userId") 
    User user; 

jetzt können Sie diesen Chat-Referenzen Benutzer sehen. Sie muss ein Benutzer sein, bevor Sie chatten können, so möchte ich in den Chat eines Benutzers auf diese Weise in dao Klasse abzurufen

// return getSession().createQuery("SELECT FROM Chats u WHERE u.id = :userIdFromSession AND u.isAdmin = true").list(); 

dies ist die Methode, die ich einen Benutzer in meinem Controller-Klasse erstellen bin mit

@RequestMapping(value = "/create-user", method = RequestMethod.POST) 
    public ModelAndView createUser(HttpServletRequest request, 
            HttpServletResponse response, 
            @RequestParam String name, 
            @RequestParam String email) { 
     try { 
      // create new user object 
      User user = new User(); 
      user.setName(name); 
      user.setEmail(email); 
      user.setTimestamp(new Date().getTime()); 

      // save user in db (if new) 
      if (_userDao.getByEmail(email) == null) { 
       _userDao.save(user); 
      } 

      // save in cookie 
      Cookie cookie = new Cookie("name", name); 
      Cookie cookie1 = new Cookie("email", email); 
      response.addCookie(cookie); 
      response.addCookie(cookie1); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      //logger.error("Exception in creating user: ", e.getStackTrace()); 
     } 

     return new ModelAndView("redirect:/"); 
    } 

Dieser Ansatz funktioniert nicht nur, da es Kompilierungsfehler verursacht. Bitte helfen!

+0

So vage Sie 'ersetzt' ": userIdFromSession" '' mit '': getSession() '' (die auch gültig Java ist nicht) und hör auf zu versuchen? – f1sh

Antwort

1

Die Hibernate Session hat nichts mit der Sitzung des Benutzers zu tun. Sie können es in Bezug auf die Verbindung mit der Datenbank vorstellen.

SessionFactory#getCurrentSession() gibt die aktuelle Sitzung zurück, wenn eine bereits geöffnet ist. Dadurch können Sie die Datenbank abfragen.

Die Art, wie ich Ihr Problem jetzt verstehe, besteht darin, die Spring MVC-Controller zu identifizieren, die sich mit der Authentifizierung befassen. Ihre Methode createUser() kann eine davon sein, aber Sie werden sicherlich auch eine authenticateUser() benötigen. Stellen wir uns vor, dass E-Mails eindeutig sind und Sie die E-Mail als Login verwenden, um Benutzer zu authentifizieren. Angenommen, Ihre getByEmail-Methode gibt einen Benutzer-POJO zurück. Ich werde Ausnahmebehandlung und Spring MVC Zeug verlassen.

Dann sollten Sie irgendwo eine getChats-Methode in einem Controller haben.

public ModelAndView getChats(HttpServletRequest request, 
           HttpServletResponse response) { 
    String email = (String) request.getSession().getAttribute("email");   
    if (email == null) { 
     // user is not logged in, deal with it. 
    } else { 
     List<Chat> chats = _chatDao.getChats(email); 
     return new ModelAndView("chatView", "chats", chats); 
    } 
} 

In ChatDao, haben Sie eine Methode wie folgt:

List<Chat> getChats(String email) { 
    String hql = "from Chat c where c.user.email = :email"; 
    _sessionFactory.getCurrentSession().createQuery(hql).setParameter("email", email).list(); 
} 
+0

Dies ist keine Antwort, es sollte ein Kommentar sein. – f1sh

+0

okay. Was könnte ich getan haben –

+0

@ f1sh, wahr genug, aber es gibt keine pure Hibernate-Lösung für sein Problem. –