2012-07-17 85 views
1

我想从行数据库中删除特定的记录。但是,当我尝试执行此查询:卡桑德拉昆德拉 - 删除记录按行键

Query query = em.createQuery(
      "DELETE FROM User u WHERE u.userId = :u"); 

query.setParameter("u", userID).executeUpdate(); 

我得到这个异常:“条件=不支载对行键查询!”。

有没有什么解决方法,或者我错过了什么?

回答

2

你可以做一个变通方法是什么:

查找使用: 用户u = em.find(User.class,用户id)

然后, em.delete(U);

+0

止跌”导致数据库读取:(...在PlayOrm中为cassandra和JPA,而是用户user = em.getReference(User.clas,userId)和em.remove(user);所以你不需要额外的数据库读取 – 2012-10-28 15:56:10

+0

em.getReference(User.clas,userId) 如何获得对实际记录的引用而不需要访问数据库甚至填充到cac中他你需要它。 无论如何,其他方式是通过执行CQL查询。同样在2.1以后,这样的查询应该可以工作。 -Vivek – 2012-10-29 02:35:02

+0

你可以看看hibernate的代码或PlayOrm的,但基本上getReference只是在没有触摸db的情况下包装Id,然后删除解包并发送删除id等于该id的行,所以不需要从数据库读取。有时候没有必要把它放在缓存中,所以我不确定你为什么引用缓存。 – 2012-10-29 11:06:18

1

以执行一种可能的方法,例如删除(在使用昆德拉,版本2.2此刻一个命令)时使用“原生查询”,例如:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("cassandra_pu"); 

EntityManager em = emf.createEntityManager(); 

// "table" is the table name (case sensitive) you name your table in Cassandra 
String query = "delete from table where key = 'keyValue'"; 

// "TablePersistencyEntity" is the Kundera Persistency Entity (Class) for the "table" 
Query q = em.createNativeQuery(query, TablePersistencyEntity.class); 
q.getResultList(); 

em.close();