如何 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。我需要使用 limit 和 offset 的 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);
如果手边有实体,您可以(并且应该)使用 EntityManager
和 remove()
删除它。您收到该错误是因为您的实体已分离 - 也就是说,您的 EntityManager
不知道它的存在。
要"attach" 个实体到您的经理,您可以使用merge()
。但是,如果该实体不存在于数据库中,它将被插入,如果它存在但与您的对象具有不同的字段,它将被更新。
public void delete(Cat cat) {
if(!entityManager.contains(cat)) {
entityManager.merge(cat);
}
entityManager.remove(cat);
}
第一次插入实体也可以使用persist()
。 merge()
和persist()
的区别,见this.
如果需要用到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();
您可以使用 EntityManager#createQuery
创建 Query
。然后设置参数:firstResult
和maxResults
:
query.setFirstResult(10).setMaxResults(20);
从 10 号开始需要 20 个实体。
我有一个实体:
@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。我需要使用 limit 和 offset 的 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);
如果手边有实体,您可以(并且应该)使用 EntityManager
和 remove()
删除它。您收到该错误是因为您的实体已分离 - 也就是说,您的 EntityManager
不知道它的存在。
要"attach" 个实体到您的经理,您可以使用merge()
。但是,如果该实体不存在于数据库中,它将被插入,如果它存在但与您的对象具有不同的字段,它将被更新。
public void delete(Cat cat) {
if(!entityManager.contains(cat)) {
entityManager.merge(cat);
}
entityManager.remove(cat);
}
第一次插入实体也可以使用persist()
。 merge()
和persist()
的区别,见this.
如果需要用到
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();
您可以使用
EntityManager#createQuery
创建Query
。然后设置参数:firstResult
和maxResults
:query.setFirstResult(10).setMaxResults(20);
从 10 号开始需要 20 个实体。