我在使用更新查询更新枚举字段时遇到一些困难。看来,每当我用新值更新枚举字段时,更新后的值就无法与新查询匹配。对于其他数据类型,更新查询可以正常工作,但不能枚举。
我尝试关闭EntityManager,EntityManagerFactory,应用程序,但是由于某种原因,该字段无法在其新状态下进行匹配。
下面是我正在使用的测试,其中的“ db”实例只是一个处理EntityManager的实例化,关闭和事务处理的类。
@Test
public void test() {
db.execute(em -> em.createQuery("UPDATE Atmosphere SET setting = :setting WHERE id=:id", Atmosphere.class)
.setParameter("setting", Atmosphere.Setting.coast)
.setParameter("id", atmosphere1.getId()).executeUpdate());
List<Atmosphere> results = db.retrieve(em -> em.createQuery("SELECT FROM Atmosphere WHERE id = :id", Atmosphere.class)
.setParameter("id", atmosphere1).getResultList());
assertFalse(results.isEmpty()); // passes
assertEquals(Atmosphere.Setting.coast, results.get(0).getSetting()); // passes, the record is updated!
results = db.retrieve(em -> em.createQuery("SELECT FROM Atmosphere WHERE setting = :setting", Atmosphere.class)
.setParameter("setting", Atmosphere.Setting.coast)
.getResultList());
assertFalse(results.isEmpty()); // fails, no results!
}
我也已经在资源管理器工具中检查了该行,可以看到它已更新,但是我仍然无法查询它。
唯一可行的方法是使用EntityManager.merge()
更新记录。
编辑:原来只有在实体的枚举字段上使用@Enumerated(EnumType.STRING)
时才会出现此问题。删除此问题可以解决此问题(在objectdb 2.7.6中)。
答案 0 :(得分:1)
经过一些实验,我发现问题仅在使用@Enumerated(EnumType.STRING)
时出现。据我所知,唯一的解决方法是删除注释,使其默认为序数类型的持久性(在objectdb 2.7.6中)。
答案 1 :(得分:1)
您是对的,使用UPDATE查询更新基于STRING的枚举字段存在问题。这是因为ObjectDB始终将参数视为ORDINAL。
一个简单的解决方法是将字段显式设置为字符串:
dec ecx/jnz
答案 2 :(得分:0)
以下代码似乎正常工作:
import javax.persistence.*;
public class T53151410 {
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory(
"objectdb:db.tmp;drop");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(new MyEntity());
em.getTransaction().commit();
em.getTransaction().begin();
System.out.println(
em.createQuery("UPDATE MyEntity SET color = :color")
.setParameter("color", Color.RED).executeUpdate()
);
em.getTransaction().commit();
System.out.println(
em.createQuery("SELECT FROM MyEntity WHERE color = :color")
.setParameter("color", Color.RED).getResultList().size()
);
em.close();
emf.close();
}
@Entity
private static class MyEntity {
Color color;
}
private static enum Color { RED, GREEN, BLUE }
}
}