SpringDataJPA中的JPQL
示例:
注:jpql查询不需要事务的支持,但增删改需要事务的支持
1.Employee实体类:
@Entity
public class Employee {
private Integer empId;
private String empAddress;
private Integer empAge;
private String empGender;
private String empName;
private Double empSalary;
private Date empStartDate;
private Integer empStatus;
// private String deptId;
private Department dept;
// private String deptDeptId;
// public String getDeptDeptId() {
// return deptDeptId;
// }
// public void setDeptDeptId(String deptDeptId) {
// this.deptDeptId = deptDeptId;
// }
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
public String getEmpAddress() {
return empAddress;
}
public void setEmpAddress(String empAddress) {
this.empAddress = empAddress;
}
public Integer getEmpAge() {
return empAge;
}
public void setEmpAge(Integer empAge) {
this.empAge = empAge;
}
public String getEmpGender() {
return empGender;
}
public void setEmpGender(String empGender) {
this.empGender = empGender;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Double getEmpSalary() {
return empSalary;
}
public void setEmpSalary(Double empSalary) {
this.empSalary = empSalary;
}
public Date getEmpStartDate() {
return empStartDate;
}
public void setEmpStartDate(Date empStartDate) {
this.empStartDate = empStartDate;
}
public Integer getEmpStatus() {
return empStatus;
}
public void setEmpStatus(Integer empStatus) {
this.empStatus = empStatus;
}
@ManyToOne
@JoinColumn(name="deptId")
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empAddress=" + empAddress + ", empAge=" + empAge + ", empGender="
+ empGender + ", empName=" + empName + ", empSalary=" + empSalary + ", empStartDate=" + empStartDate
+ ", empStatus=" + empStatus + "]";
}
public Employee(Integer empId, String empAddress, Integer empAge, String empGender, String empName,
Double empSalary, Date empStartDate, Integer empStatus) {
super();
this.empId = empId;
this.empAddress = empAddress;
this.empAge = empAge;
this.empGender = empGender;
this.empName = empName;
this.empSalary = empSalary;
this.empStartDate = empStartDate;
this.empStatus = empStatus;
}
public Employee() {
}
public Employee(Integer empId, String empName, Double empSalary) {
super();
// System.out.println("调用了三个参数的有参构造方法");
this.empId = empId;
this.empName = empName;
this.empSalary = empSalary;
}
}
2.Department实体类:
@Entity
public class Department {
private Integer deptId;
private String deptName;
private String deptManager;
private Set<Employee> emps = new HashSet();
@OneToMany(mappedBy="dept",fetch=FetchType.LAZY)
// @JoinColumn(name="deptId")
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getDeptManager() {
return deptManager;
}
public void setDeptManager(String deptManager) {
this.deptManager = deptManager;
}
@Override
public String toString() {
return "Department [deptId=" + deptId + ", deptName=" + deptName + ", deptManager=" + deptManager + "]";
}
public Department(Integer deptId, String deptName, String deptManager) {
super();
this.deptId = deptId;
this.deptName = deptName;
this.deptManager = deptManager;
}
public Department() {
super();
}
}
3.EmployeeDao接口层:
public interface EmployeeDao extends Repository<Employee, Integer>{
/**
* 按照id修改用户的名字和年龄
*/
@Modifying
@Query("update Employee e set e.empName = ?1,e.empAge=?2 where e.empId=?3")
public Integer updateNameAndAgeById(String empName,Integer empAge,Integer id);
/**
* 什么时候,使用JPQL?
* 方法命名规范很好用,不一定能胜任任何场景,编写JPQL与方法映射。
*/
/**
* 按照性别查询员工信息,要求使用jpql
*/
// @Query("select e from Employee e where e.empGender = ?1")
@Query(value="select * from employee where empGender = ?1",nativeQuery=true)
public List<Employee> abcdefg(String gender);
}
4.EmployeeService服务层:
public interface EmployeeService {
public Integer updateNameAndAgeById(String empName,Integer empAge,Integer empId);
}
5.EmployeeServiceImpl实现类:
@Service
@Transactional
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeDao employeeDao;
@Override
public Integer updateNameAndAgeById(String empName, Integer empAge, Integer empId) {
Integer updateNameAndAgeById = employeeDao.updateNameAndAgeById(empName,empAge,empId);
return updateNameAndAgeById;
}
}
6.测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring-beans.xml")
public class EmployeeServiceTest {
@Autowired
EmployeeService service;
@Test
public void testUpdateNameAndAgeById() {
Integer updateNameAndAgeById = service.updateNameAndAgeById("钱媛", 18, 9);
System.out.println(updateNameAndAgeById);
}
@Test
public void testAbcdef(){
List<Employee> abcdefg = employeeDao.abcdefg("男");
for (Employee employee : abcdefg) {
System.out.println(employee.getEmpName()+":"+employee.getEmpAge()+":"+employee.getEmpGender());
}
}
}
7.spring-beans.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 数据源 数据库连接池 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- Spring整合Jpa -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
</property>
<!-- 配置与数据映射的实体类所在的包,对应之前的class标签 -->
<property name="packagesToScan" value="com.kmu.entity"></property>
<property name="jpaProperties">
<props>
<!-- 数据表的列的映射策略 可选的 <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> -->
<!-- 底层实现框架,hibernate 基本属性 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 事务支持的 注解驱动的事务管理方式 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Spring扫描组件的配置
针对service层
针对持久层dao、Repository,持久层是接口,是Spring根据配置,来动态生成的,并且注入到Spring容器。
无需针对持久层,进行注解配置。只需要扫描这些持久层接口。
针对web :Controller
-->
<jpa:repositories base-package="com.kmu.repository"></jpa:repositories>
<context:component-scan base-package="com.kmu.service"></context:component-scan>
</beans>
8.jdbc.properties配置文件:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/jpa
jdbc.user=root
jdbc.password=123123