Hibernate-jpa查询

本文探讨了使用Hibernate和JPA进行数据查询的方法,包括HQL查询、SQL查询以及QBC查询。通过entityManager.createQuery执行HQL,利用createNativeQuery进行原生SQL操作,同时也讲解了QBC查询的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JPA :由 Sun 公司提供了一对对于持久层操作的标准 ( 接口 + 文档 )
Hibernate: Gavin King 开发的一套对于持久层操作的自动的 ORM 框架。
Hibernate JPA: 是在 Hibernate3.2 版本那种提供了对于 JPA 的标准的实现。提供了一套按照 JPA 标准来实现持久层开发的 API
 
按照JPA的标准,我们的配置文件需要更改如下
<!-- Spring整合JPA  配置EntityManagerFactory-->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<!-- hibernate相关的属性的注入 -->
				<!-- 配置数据库类型 -->
				<property name="database" value="MYSQL"/>
				<!-- 正向工程 自动创建表 -->
				<property name="generateDdl" value="true"/>
				<!-- 显示执行的SQL -->
				<property name="showSql" value="true"/>
			</bean>
		</property>
		<!-- 扫描实体的包 -->
		<property name="packagesToScan">
			<list>
				<value>com.zxw.pojo</value>
			</list>
		</property>
	</bean>

<!-- 配置Hibernate的事务管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"/>
	</bean>
Hibernate JPA CRUD 操作
(注意与原生hibernate不同的地方:插入为 persist ,修改为 merge ,删除为 remove ,查询为 find
 
  @PersistenceContext:该注解是为了从entityManagerFactory中获得entityManager进行注入。
(之前我们一般使用@autowired,这回不能使用,因为我们IOC容器中并没有entityManager,需要工厂来产生)
package com.zxw.dao.impl;

import com.zxw.dao.UsersDao;
import com.zxw.pojo.Users;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;

@Repository
public class UsersDaoImpl implements UsersDao {

    @PersistenceContext(name="entityManagerFactory")
    private EntityManager entityManager;

    @Override
    public void insertUsers(Users users) {
        this.entityManager.persist(users);
    }

    @Override
    public void updateUsers(Users users) {
        this.entityManager.merge(users);
    }

    @Override
    public void deleteUsers(Users users) {
        Users u = this.selectUsersById(users.getUserid());
        this.entityManager.remove(u);

    }

    @Override
    public Users selectUsersById(Integer userid) {
        return this.entityManager.find(Users.class,userid);

    }

}

HQL查询

entityManager.createQuery

@Override
    public List<Users> selectUserByName(String username) {
        return this.entityManager.createQuery("from Users where username = :abc").setParameter("abc",username).getResultList();
    }

SQL查询(注意查数和原生hibernate的SQL不同)

entityManager.createNativeQuery

@Override
    public List<Users> selectUserByNameSQL(String username) {
        //在Hibernate JPA中 如果通过?方式来帮顶参数,那么他的查数是从1开始的。而hibernate中是从0开始的。
        return this.entityManager.createNativeQuery("select * from t_users where username = ?", Users.class).setParameter(1, username).getResultList();
    }

QBC查询

@Override
    public List<Users> selectUserByNameUseCriteria(String username) {
        //创建查询条件
        CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
        //执行查询的Criteria对象
        CriteriaQuery<Users> query = builder.createQuery(Users.class);
        //获取要查询的实体类对象
        Root<Users> root = query.from(Users.class);
        //封装查询条件
        Predicate cate = builder.equal(root.get("username"),username);
        query.where(cate);

        //执行查询
        TypedQuery<Users> usersTypedQuery = this.entityManager.createQuery(query);
        return usersTypedQuery.getResultList();
    }

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值