`

entityManager来主键查找类和entityManager.createQuery的区别

阅读更多

(1)首先看下代码:

public Long getServerIdBypublishWebsiteId(Long id) {
	Site tempSite = entityManager.find(Site.class, id);
//	Long serverId = (Long)entityManager.createQuery("SELECT s.serverId FROM Site s WHERE s.id= "+id).getSingleResult();
	if (tempSite != null && tempSite.getServerId() != null) {
		return tempSite.getServerId();
	} else {
		return null;
	}
}

 (2) Site tempSite = entityManager.find(Site.class, id);这种方式是通过主键来查找类的形式,一般情况下是这样用的。所以一般情况下如果知道主键的ID就应该先想到这种方式来查找类。

 (3) Long serverId = (Long)entityManager.createQuery("SELECT s.serverId FROM Site s WHERE s.id= "+id).getSingleResult();
这种查询方式不适合用于主键的查询。至少我就在此碰到了错误:

错误场景的描述:
    我在site list的页面,当我点击delete的链接时,它删除成功了,但是页面却没有及时的更新即数据库中的这条记录已经删除了,而页面中这条记录还存在。所以当然啦这个主键的ID就依然存在。
    在删除这个数据之后它还会跳到本页面中,而这个时候(因为在本页面中它会去调用getServerIdBypublishWebsiteId这个方法),如果用Long serverId = (Long)entityManager.createQuery("SELECT s.serverId FROM Site s WHERE s.id= "+id).getSingleResult();这种形式的话,页面就会报错。
    原因在什么地方呢?
    此时的id是有值的,但是不要忘记了数据库中是没有值的,恰在此时你要去调用getSingleResult,这个肯定会报错啦。原因就是这个。
    但是如果用Site tempSite = entityManager.find(Site.class, id);的话,就不会报错,虽然这个id是有值的,但是它从数据库里一查找这个Site的对象却没有发现,所以tempSite就是个空值,这样就不会报错的在页面中。

 

(4)所以以后如果有主键最好是想到那个find方法。

分享到:
评论

相关推荐

    Hibernate EntityManager用法

    EntityManager提供了一些方法来管理实体,如`persist()`用于保存新实体,`merge()`用于更新现有实体,`remove()`用于删除实体,以及`find()`用于根据主键查找实体。 **4. 查询** Hibernate EntityManager支持JPA的...

    D_JPA_02_简单实体映射和API.zip

    这些类需要使用`@Entity`注解来标识,并且通常有一个与表的主键对应的字段,使用`@Id`注解。例如: ```java @Entity public class User { @Id private Long id; private String name; // getters and setters }...

    hibernate-entitymanager-3.3.2.GA

    3. **实体定义**: 使用@Entity注解标记实体类,@Table指定对应的数据库表,@Id定义主键,其他属性用@Column注解。 4. **实体管理工厂**: 通过EntityManagerFactory创建EntityManager实例,它是操作实体的主要接口。...

    JAVA 持久化应用指南

    2. 创建`persistence.xml`配置文件,定义数据源、实体类和持久化配置。 3. 在代码中通过`Persistence.createEntityManagerFactory()`创建实体单元实例。 ### 2. 服务器属性设置 在`persistence.xml`中,可以配置...

    基于JPA的CRUD例子

    例如,我们可以使用JPQL来查找所有年龄大于25岁的人员: ```java String query = "SELECT p FROM Person p WHERE p.age > :age"; List<Person> personsOver25 = entityManager.createQuery(query, Person.class) ....

    JPA读写数据库java代码

    每个实体类通常有主键,用`@Id`注解标识。例如: ```java @Entity public class User { @Id private Long id; private String name; // getters and setters } ``` 2. **实体管理工厂...

    jpa--15.jpa基本api

    3. **查找实体(Find)**: `EntityManager.find(Class entityClass, id)`方法根据实体类和ID来查找对应的实体,如果找不到则返回null。 4. **更新实体(Merge)**: `EntityManager.merge(entity)`将实体的最新状态...

    jap对单表的增删改查.zip

    它的核心概念包括实体(Entity)、实体类(Entity Class)、实体管理器(EntityManager)和实体管理工厂(EntityManagerFactory)。实体类通常对应数据库中的表,而实体管理器则负责执行CRUD操作。 在"jpatest"这个...

    hibernateentitymanager

    2. **实体类定义**:定义实体类,使用@Entity注解标记,@Table指定对应的数据库表,@Id标注主键字段。 3. **实体管理工厂**:通过Persistence.createEntityManagerFactory()获取EntityManagerFactory。 4. **操作...

    ssh集成jpa和使用注解案例

    例如,我们可以使用@Entity注解标记一个类作为实体,@Table注解指定对应的数据库表,@Id表示主键,@GeneratedValue指定主键生成策略。字段级别的注解如@Column用于字段到列的映射,@ManyToOne、@OneToMany等用于建立...

    基于SpringBoot+JPA的信息管理系统

    例如,调用`entityManager.persist(entity)`来保存新实体,`entityManager.find(Entity.class, id)`来查找特定ID的实体,`entityManager.createQuery(jpql)`来执行JPQL(Java Persistence Query Language)查询。...

    JPA实例,新手必备之佳品,记得查看ReadMe.txt

    此外,类的属性对应表的列,`@Id`注解表示主键字段,`@GeneratedValue`用于自动生成主键值。 JPA的核心组件包括: 1. **EntityManager**: 这是JPA的主要接口,负责与数据库进行交互,如保存、删除、查询实体。 2. *...

    JPA生成方法

    在JPA中,数据持久化主要通过实体类(Entity)、实体管理器(EntityManager)和实体管理工厂(EntityManagerFactory)来实现。首先,我们需要创建一个表示数据库表的实体类,通常会使用`@Entity`注解来标记这个类,...

    EJB3.0实例教程

    4.3 STATELESS SESSION BEAN与STATEFUL SESSION BEAN的区别...............................................................................22 4.4 如何改变SESSION BEAN的JNDI 名称...............................

    jpa教程 JPA

    创建实体类时,需要使用 JPA 注解来标记实体类、主键字段等。 **示例代码**: ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private ...

    JPA(Java Persistence API) JPA中文教程

    6. **查询**:使用`entityManager.createQuery(jpqlString)`或`entityManager.createCriteriaBuilder()`创建并执行查询。 7. **关闭资源**:在完成操作后,记得关闭实体管理器和实体管理器工厂。 **JPA的优势:** ...

    简单JPA例子

    `EntityManagerFactory`用于创建`EntityManager`实例,而`Persistence`类提供了静态方法来创建`EntityManagerFactory`。在应用的配置文件中,我们可以定义数据源和JPA供应商的相关配置。 ```java <provider>org....

    07_JPA详解_使用JPA加载_更新_删除对象.zip

    List<MyEntity> entities = entityManager.createQuery("SELECT e FROM MyEntity e", MyEntity.class).getResultList(); ``` ### 3. 更新对象 #### 3.1 持久化状态 当实体处于持久化状态时,任何改变都会自动同步...

    JPA Demo 简单的了解下jpa

    它是Java EE和Java SE环境中处理对象关系映射(ORM)的一种规范,旨在简化数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务,而无需直接编写SQL语句。 **JPA核心概念** 1. **实体(Entity)**: 在...

Global site tag (gtag.js) - Google Analytics