I am using JPA and spring boot. I am new to JPA. I want to retrieve an object by passing the value of the function. But in example, it is done through hibernate config. I have not config sessionFactory bean
in my classpath. I want to use JPA to retrieve the object. Here in the example, it is:
// Transactional for Hibernate @Transactional public class AccountDAOImpl implements AccountDAO { @Autowired private EntityManager entityManager; @Override public Account findAccount(String userName) { Session session = sessionFactory.getCurrentSession(); Criteria crit = session.createCriteria(Account.class); crit.add(Restrictions.eq("userName", userName)); return (Account) crit.uniqueResult(); } }
But I tried in JPA like this:
// Transactional for Hibernate @Transactional public class AccountDAOImpl implements AccountDAO { @Autowired private EntityManager em; @Override public Account findAccount(String userName) { CriteriaBuilder cm= em.getCriteriaBuilder(); cm.createQuery(Account.class); cm.add(Restrictions.eq("userName", userName)); return (Account) crit.uniqueResult(); } }
But it is showing me error,How can i pass the username using JPA?
my pom.xml is:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ashwin</groupId> <artifactId>vemployee</artifactId> <version>0.0.1-SNAPSHOT</version> <name>vemployee</name> <description>Demo project for Spring Boot for offc</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Security Core --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> </dependency> <!-- Spring Security Config --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> </dependency> <!-- Spring Security Web --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/jstl/jstl --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- needed for jsp --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.27</version> </dependency> <!--bootsrap and jquery--> <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>4.3.1</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.4.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.webjars/bootstrap-datepicker --> <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap-datepicker</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
I also tried as follows:
TypedQuery<Account> query=em.createQuery("Select a from Account a where a.userName = :userName",Account.class); query.setParameter(1,userName); Account acc=query.getResultList().get(0); return acc;
But how to set username here?
Advertisement
Answer
You can use JPQL like this
@Override public Account findAccount(String userName) { return em.createQuery("select account from Account account where account.username = :username", Account.class) .setParameter("username", userName).getSingleResult(); }