Search code examples
javamysqlhibernatehibernate-mapping

Hibernate returns null hql in query with @ManyToOne


First I apologize if my question seems a bit amateurish, but my knowledge with hibernate / jpa and mysql are somewhat limited.

Well, I have the following entity:

User Entity

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_user")
    private Long idUser;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String email;

    @ManyToOne(optional = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "level", referencedColumnName = "id_level", nullable = true)
    private Level level;

    @Transient
    private Long totalLikes;
}

From there, I'm trying to do the following mysql query:

public User findUserByEmail(String email) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        User user = null;

        String hql = "SELECT "
                   + "u.idUser as idUser, "
                   + "u.nome as nome, "
                   + "u.level as level, "
                   + "(SELECT count(*) FROM UserLikes likes WHERE likes.user = u.idUser) as totalLikes "
            + "FROM User u WHERE u.email = :email";
        try {
            Query query = session.createQuery(hql);
            query.setString("email", email);
            query.setResultTransformer(Transformers.aliasToBean(User.class));
            user = (Usuario) query.uniqueResult();

        } catch (RuntimeException ex) {
            throw ex;
        } finally {
            session.close();
        }

        return user;
    }

The above code returns the User normally, however returns null when the User to search in the database do not have value set in the field level. That is, if I am not wrong, hibernate does an inner join user / level and not a left join, making returns null.

Does anyone have any idea how to get around this?


Solution

  • i think you need use this.

    @ManyToOne //simple
    @JoinColumn(nullable = true) simple
    

    and in your query using simple too.

    FROM User u WHERE u.email = :email
    

    i use this in similiar project and worked.

    Good job man.