Query
package org.example.demo.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.createQuery("from Person").getResultList();
em.close();
factory.close();
}
}
生成 SQL
select person0_.id as id1_3_, person0_.address as address2_3_, person0_.createdOn as createdO3_3_, person0_.name as name4_3_, person0_.nickName as nickName5_3_, person0_.version as version6_3_ from Person person0_
TypedQuery
package org.example.demo.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.createQuery("select p from Person p", Person.class).getResultList();
em.close();
factory.close();
}
}
生成 SQL
select person0_.id as id1_3_, person0_.address as address2_3_, person0_.createdOn as createdO3_3_, person0_.name as name4_3_, person0_.nickName as nickName5_3_, person0_.version as version6_3_ from Person person0_
若将第 12 行改为 em.createQuery("select p, p.phones from Person p", Person.class).getResultList();
则将抛异常 java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [org.example.demo.hibernate.Person]
EntityManager.createNamedQuery
package org.example.demo.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.createNamedQuery("get_person_by_name").setParameter("name", "bob").getResultList();
em.close();
factory.close();
}
}
生成的 SQL
select person0_.id as id1_3_, person0_.address as address2_3_, person0_.createdOn as createdO3_3_, person0_.name as name4_3_, person0_.nickName as nickName5_3_, person0_.version as version6_3_ from Person person0_ where person0_.name='bob'
EntityManager.createNamedQuery TypedQuery
package org.example.demo.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.createNamedQuery("get_person_by_name", Person.class).setParameter("name", "bob").getResultList();
em.close();
factory.close();
}
}
生成的 SQL
select person0_.id as id1_3_, person0_.address as address2_3_, person0_.createdOn as createdO3_3_, person0_.name as name4_3_, person0_.nickName as nickName5_3_, person0_.version as version6_3_ from Person person0_ where person0_.name='bob'
Basic JPA Query usage
package org.example.demo.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FlushModeType;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.createQuery("select p " + "from Person p " + "where p.name like :name").setParameter("name", "bob")
// timeout - in milliseconds
.setHint("javax.persistence.query.timeout", 2000)
// flush only at commit time
.setFlushMode(FlushModeType.COMMIT).getResultList();
em.close();
factory.close();
}
}
生成的 SQL
select person0_.id as id1_3_, person0_.address as address2_3_, person0_.createdOn as createdO3_3_, person0_.name as name4_3_, person0_.nickName as nickName5_3_, person0_.version as version6_3_ from Person person0_ where person0_.name like 'bob'
FIXME
JPA name parameter binding
package org.example.demo.hibernate;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TemporalType;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.createQuery("from Person p where p.createdOn > :timestamp")
.setParameter("timestamp", new Date(), TemporalType.DATE).getResultList();
em.close();
factory.close();
}
}
生成的 SQL
select person0_.id as id1_3_, person0_.address as address2_3_, person0_.createdOn as createdO3_3_, person0_.name as name4_3_, person0_.nickName as nickName5_3_, person0_.version as version6_3_ from Person person0_ where person0_.createdOn>'2017-06-24 20:16:12'
JPA positional parameter binding
package org.example.demo.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
em.createQuery("from Person p where p.name like ?1").setParameter(1, "J%").getResultList();
em.close();
factory.close();
}
}
生成的 SQL
select person0_.id as id1_3_, person0_.address as address2_3_, person0_.createdOn as createdO3_3_, person0_.name as name4_3_, person0_.nickName as nickName5_3_, person0_.version as version6_3_ from Person person0_ where person0_.name like 'J%'
JPA getResultList() result
package org.example.demo.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
Person p1 = new Person();
p1.setName("p1");
Person p2 = new Person();
p2.setName("p2");
em.getTransaction().begin();
em.persist(p1);
em.persist(p2);
em.getTransaction().commit();
// javax.persistence.NonUniqueResultException: query did not return a unique result: 2
em.createQuery("from Person").getSingleResult();
em.close();
factory.close();
}
}