如何在Spring Boot Application中使用JPA删除/ getList

问题描述 投票:1回答:2

我有一个实体:

@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.我需要带有限制和偏移量的getList。

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

没有entityManager我使用prepatedStatement:

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

题: 我怎样才能使用entityManager? entityManager有类似prepareStatement的东西吗?

java spring hibernate spring-boot jpa
2个回答
2
投票

使用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();

选择示例(使用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并不知道它的存在。

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

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

    entityManager.remove(cat);
}

要第一次插入实体,您还可以使用persist()。有关merge()persist()之间的差异,请参阅this


1
投票
  1. 如果你需要使用EntityManager,那么只需使用参考: entityManager.remove(entityManager.getReference(Cat.class, id)); 这样,实体将不会从db中获取,但会被删除。 使用查询也是一个选项: Query query = entityManager.createQuery("delete from Entity e where e = :entity"); query = query.setParameter("entity", entity); query.executeUpdate();
  2. 你可以使用Query创建EntityManager#createQuery。然后设置参数:firstResultmaxResultsquery.setFirstResult(10).setMaxResults(20); 这将从10日开始需要20个实体。
© www.soinside.com 2019 - 2024. All rights reserved.