【问题标题】:How to delete/getList using JPA in Spring Boot Application如何在 Spring Boot 应用程序中使用 JPA 删除/getList
【发布时间】:2019-07-17 04:18:57
【问题描述】:

我有一个实体

@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 ->“删除分离的实例 com.entities.Cat#cats”中按名称获取它。

问题:我怎样才能做到不从数据库中获取

2。我需要使用 limitoffset 获取列表。

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

没有 entityManager 我使用 prepatedStatement 和:

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

问题
我如何使用 entityManager 来做到这一点?
entityManager 有类似 preparedStatement 的东西吗?

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa jpql


    【解决方案1】:

    使用EntityManager,您可以使用Query 对象。它为您提供了几种不同的方法来构建您的查询,您可以在Docs 中看到这些方法。

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

    更新示例:

    //: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();
    

    选择示例(使用实现QueryTypedQuery

    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 不知道它的存在。

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

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

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

    【讨论】:

    • 我只有一点点问题 - 当我试图获取列表时它可以工作,但在 String sql = "select e from Entity e" 编译器说 "Can't resolve symbol Entity"
    • 那是因为你应该用你自己的类替换“Entity”
    • 我换了,只是我有问题的一个例子
    • 请添加堆栈跟踪
    • 它可以工作,但在我的情况下,intellij idea 说“无法解析符号 Cat”。但是当我尝试运行它时,它给了我正确的结果,没有异常、错误等。
    【解决方案2】:
    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 个实体。

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2018-08-17
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2017-03-28
      • 2018-11-19
      相关资源
      最近更新 更多