如果我们只需要查询实体中的某些属性,但是不希望查询的结果返回的是对象数组,就可以使用JPQL通过实体的构造器进行查询,这样查询结果返回的就是实体。
实体User.java:
package com.cndatacom.jpa.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="t_user") public class User { /** * 主键 */ @Id @GeneratedValue private Long id; /** * 名字 */ @Column(name="name",length=50) private String name; /** * 密码 */ @Column(name="password",length=20) private String password; /** * 邮箱 */ @Column(name="email",length=50) private String email; /** * 年龄 */ @Column(name="age",length=3) private int age; public User() { } //使用name属性和age属性的构造方法 public User(String name, int age) { super(); this.name = name; this.age = age; } //使用name属性、email属性和age属性的构造方法 public User(String name, String email, int age) { super(); this.name = name; this.email = email; this.age = age; } //以下省略getter/setter方法 //...... }
1、如果我们只是要查询User实体的name属性和age属性,先在User类中提供以这两个属性为参数的构造方法。再使用下面的语句进行查询:
SELECT new User(u.name,u.age) FROM User u
使用new User(u.name,u.age)使得返回的查询结果是实体的集合。
String jpql = "SELECT new User(u.name,u.age) FROM User u"; Query query = em.createQuery(jpql); List<User> resultList = query.getResultList();
2、如果我们只是要查询User实体的name属性、email属性和age属性,先在User类中提供以这三个属性为参数的构造方法,再使用下面的语句进行查询:
SELECT new User(u.name,u.email,u.age) FROM User u
使用new User(u.name,u.email,u.age)使得返回的查询结果是实体的集合。
String jpql = "SELECT new User(u.name,u.email,u.age) FROM User u"; Query query = em.createQuery(jpql); List<User> resultList = query.getResultList();