jpa 查询 列表
我们可以在Internet上找到一些JPA“如何做”,在本博客的此处,教您如何使用JPA执行多项任务。
通常,我看到有人问有关使用JPA进行查询的问题。 通常,为了回答此类问题,提供了几个链接以尝试找到该问题的解决方案。
直到今天,我仍然找不到一个博客文章,其中汇集了有关使用JPA查询,性能/利用技巧,要下载的源代码的良好主题……
今天我们将看到:
- 模型类和将生成数据库数据的类
- 查找方法; 使用getReference方法可获得更好的性能,并使用log4j在控制台中显示查询参数
- JPQL:具有简单参数或对象的查询,联接,排序依据,在关系中导航
- JPQL:功能:AVG,COUNT,MAX,MIN,TRIM,SUM,UPPER,LOWER,MOD,LENGHT,SQRT; 使用HAVING,GROUP BY
- JPQL:筛选条件:LIKE,IN,DISTINCT,EMPTY,BETWEEN,NULL,MEMBER OF,EXISTS(子查询),ANY,ALL,SOME,CONCAT,CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,LOCATE,SIZE,SUBSTRING
- JPA:NamedQuery,使用日期查询,有关getSingleResult方法的警告
- JPA:NativeQuery,名为NativeQuery
- JPA:复杂的本地查询
- JPA:使用EJB优化查询
- JPA:分页
- JPA:数据库提示
- JPA:通过查询创建对象
- JPQL:批量更新和删除
- JPA:条件
您将看到在每个主类中,我们将调用方法“ CodeGenerator.generateData() ”。 此类方法仅在数据库中创建数据; 有了这些数据,我们的查询将找到正确的结果。
在这篇文章的最后一页中,您会找到下载该文章源代码的链接。
在本文中,我们将使用带有Hibernate的JPA 2.0作为提供程序。 该数据库将是HSQLDB,并将附加到该项目。 您可以下载源代码并运行项目,而无需任何其他配置。 我们不会谈论如何设置HSQLDB,因为本文的重点是如何查询数据库的数据。
这篇文章在某些方面不会使用开发的最佳实践。 这篇文章的重点是展示JPA查询的工作方式。
模型类和将生成数据库数据的类
package com.model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@OneToMany(mappedBy = 'person', cascade = CascadeType.ALL)
private List<Dog> dogs;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name='address_id')
private Address address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<Dog> getDogs() {
if (dogs == null) {
dogs = new ArrayList<Dog>();
}
return dogs;
}
public void setDogs(List<Dog> dogs) {
this.dogs = dogs;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public int hashCode() {
return getId();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person person = (Person) obj;
return person.getId() == getId();
}
return false;
}
}
package com.model;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Dog {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
private double weight;
@Temporal(TemporalType.TIMESTAMP)
private Date dateOfBirth;
public Dog() {
}
public Dog(String name, double weight, Date dateOfBirth) {
this.name = name;
this.weight = weight;
this.dateOfBirth = dateOfBirth;
}
public static void main(String[] args) {
System.out.println(new Date());
}
@ManyToOne
private Person person;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public int hashCode() {
return getId();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Dog) {
Dog dog = (Dog) obj;
return dog.getId() == getId();
}
return false;
}
}
package com.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String streetName;
private int houseNumber;
public Address() {
}
public Address(String streetName, int houseNumber) {
this.streetName = streetName;
this.houseNumber = houseNumber;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public int getHouseNumber() {
return houseNumber;
}
public void setHouseNumber(int houseNumber) {
this.houseNumber = houseNumber;
}
@Override
public int hashCode() {
return getId();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Address) {
Address address = (Address) obj;
return address.getId() == getId();
}
return false;
}
}
我们获得了一些具有单向和双向关系的基本类。 这些关系将帮助我们处理将要执行的所有类型的查询。
为了生成数据库数据,我们具有以下类:
package com.main;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.model.Address;
import com.model.Dog;
import com.model.Person;
public class CodeGenerator {
private static EntityManagerFactory emf;
private static EntityManager em;
public static final String PERSON01_NAME = 'John';
public static final String PERSON02_NAME = 'Mary';
public static final String PERSON03_NAME = 'Anna';
public static final String PERSON04_NAME = 'Joseph';
public static final String PERSON05_NAME = 'Mark';
public static final String PERSON06_NAME = 'I will not have any relationship';
public static void startConnection() {
emf = Persistence.createEntityManagerFactory('JpaQuery');
em = emf.createEntityManager();
em.getTransaction().begin();
}
public static void closeConnection() {
em.getTransaction().commit();
emf.close();
}
public static void generateData() {
int year = 1995;
int month = 1;
int day = 10;
Dog dog01 = new Dog('Yellow', 3.5d, createNewDate(day, month, year));
Dog dog02 = new Dog('Brown', 8.5d, createNewDate(++day, ++month, ++year));
Dog dog03 = new Dog('Dark', 15.5d, createNewDate(++day, ++m