jpa 手动预编译
JPA提供了几种查询数据的方法。 可以根据各种标准(例如,使用的语言(SQL与JPQL)或查询是静态的(编译时间)还是动态的(执行时间))对此类替代方案进行分类。
静态查询是使用@Entity类定义本身中的注释@NamedQuery ( javax.persistence.NamedQuery )和@NamedQueries ( javax.persistence.NamedQueries )定义的:
@NamedQuery(
name="findAllCustomersWithName",
query="SELECT c FROM Customer c WHERE c.name LIKE :custName"
)
另一方面, EntityManager提供了分别接受JPQL或SQL查询的createQuery(…)和createNativeQuery(…)方法。
因此,可以在编译或执行时定义查询。
( 注意 :建议始终使用Query中的 setParameter(…)方法来使用参数化查询,以避免SQL注入漏洞。)
标准API
但是,JPA提供了另一种查询对象的方法: Criteria API 。 确实,切换到JPA的动机之一是处理对象而不是SQL方言,不是吗?
让我们看一个示例代码。
实体定义:
@Entity
public class User {
@Id
private Integer userId;
@Basic
@Column(length=15, nullable=false)
private String name;
@Basic
@Column(length=64, nullable=false)
private String userDigestedPasswd;
@Basic
@Column(l