如何 delete/getList 在 Spring 引导应用程序中使用 JPA

How to delete/getList using JPA in Spring Boot Application

我有一个实体:

@Entity
@Table(name ="cats")
public class Cat {
    @Id
    @Column(name="name")
    private String name;

    @Column(name="age")
    private int age;

    @Column(name="color")
    private String color;

    @Column(name="weight")
    private int weigth;
  ..
}

1。我需要使用EntityManager从数据库中删除它:

@Override
public void delete(Cat cat) {
    entityManager.remove(cat);
}

问题:我有一个 Map<String, Cat>,其中包含所有这些元素。我从地图 IllegalArgumentException -> "Removing a detached instance com.entities.Cat#cats" 中按名称获取它。

问题: 怎么才能做到没有得到 从数据库中按键?

2。我需要使用 limitoffset 的 getList。

获取所有我可以使用的元素:
entityManager.createNativeQuery("SELECT name, age, color, weight FROM cats");

没有 entityManager 我使用了 prepatedStatement与:

"SELECT name, age, color, weight FROM cats LIMIT ?,?"

问题:
我如何使用 entityManager?
entityManager 有类似 preparedStatement 的东西吗?

通过 EntityManager,您可以使用 Query 个对象。它为您提供了几种不同的方法来构建您的查询,您可以在 Docs.

中看到这些方法

从那里,您可以使用 Query 执行 select 或对数据库执行更新。

更新示例:

//:id is a parameter you can set
Query query = entityManager.createQuery("delete from Entity e where e.id = :id");
query = query.setParameter("id", id);
query.executeUpdate();

Select 示例(使用 TypedQuery 实现 Query

String sql = "select e from Entity e";
TypedQuery<Entity> query = entityManager.createQuery(sql, Entity.class);
System.out.println(query.getResultList());

您可以像这样确定限制和偏移量:

query = query.setFirstResult(offset);
query = query.setMaxResults(limit);

如果手边有实体,您可以(并且应该)使用 EntityManagerremove() 删除它。您收到该错误是因为您的实体已分离 - 也就是说,您的 EntityManager 不知道它的存在。

要"attach" 个实体到您的经理,您可以使用merge()。但是,如果该实体不存在于数据库中,它将被插入,如果它存在但与您的对象具有不同的字段,它将被更新。

public void delete(Cat cat) {
    if(!entityManager.contains(cat)) {
        entityManager.merge(cat);
    }

    entityManager.remove(cat);
}

第一次插入实体也可以使用persist()merge()persist()的区别,见this.

  1. 如果需要用到EntityManager,那就直接用参考:

    entityManager.remove(entityManager.getReference(Cat.class, id));
    

    这样实体就不会从数据库中获取,而是会被删除。

    使用查询也是一种选择:

    Query query = entityManager.createQuery("delete from Entity e where e = :entity");
    query = query.setParameter("entity", entity);
    query.executeUpdate();
    
  2. 您可以使用 EntityManager#createQuery 创建 Query。然后设置参数:firstResultmaxResults

    query.setFirstResult(10).setMaxResults(20);
    

    从 10 号开始需要 20 个实体。