Search code examples
javapostgresqlspring-boothibernate

no viable alternative at input 'SELECT*'


I'm trying to create a postgresql query and Use entityManger to create the query, but got errors during the creation.

Caused by: org.hibernate.query.sqm.ParsingException: line 1:7 no viable alternative at input 'SELECT*' at org.hibernate.query.hql.internal.StandardHqlTranslator$1.syntaxError(StandardHqlTranslator.java:46)

This query works fine from sql console

SELECT * FROM user_details where user_name = ? LIMIT 1

@Component
@RequiredArgsConstructor
public class UserDaoImp implements UserDao {

    private final EntityManagerFactory entityManagerFactory;

    private static final String FIND_USER_BY_NAME =
            "SELECT * FROM user_details where user_name = ? LIMIT 1";

    @Override
    public User findUserByName(String userName) {
        TypedQuery<User> query = getEntityManager().createQuery(FIND_USER_BY_NAME, User.class);
        query.setParameter("user_name", userName);

        return query.getSingleResult();
    }

Not sure where i missed


Solution

  • The use of a native SQL query in JPA with Hibernate is the cause of the issue you reported. Use entity and attribute names along with positional parameters to correct it. Try this updated code;

    @Component
    @RequiredArgsConstructor
    public class UserDaoImp implements UserDao {
    
        private final EntityManagerFactory entityManagerFactory;
    
        private static final String FIND_USER_BY_NAME =
                "SELECT u FROM User u WHERE u.userName = ?1";
    
        @Override
        public User findUserByName(String userName) {
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            try {
                TypedQuery<User> query = entityManager.createQuery(FIND_USER_BY_NAME, User.class);
                query.setParameter(1, userName);
    
                return query.getSingleResult();
            } finally {
                entityManager.close();
            }
        }
    }
    

    Hope it Works :)