2012-07-17 2 views
1

Я пытаюсь удалить определенную запись из базы данных по строке. Но когда я пытаюсь выполнить этот запрос:Kundera for Cassandra - Удаление записи по строке строки

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

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

Я получил это исключение: «Условие = не suported для запроса на ключ строки!».

Есть ли обходной путь, или я чего-то не хватает?

ответ

2

Что вы можете сделать, как обходной путь является:

Найти с помощью: пользователя и = em.find (User.class, идентификатор пользователя)

, а затем, em.delete (и);

+0

Wouldn» t, которые заставляют базу данных читать: (... в PlayOrm для cassandra и JPA вместо этого вы используете User user = em.getReference (User.clas, userId) и em.remove (пользователь), поэтому вам не нужны дополнительные базы данных читать. –

+0

em.getReference (User.clas, userId) Как бы вы получили ссылку на фактическую запись, не касаясь DB даже для заполнения в cac он вам нужен. В любом случае, другим способом является выполнение запроса CQL. Также с 2.1 и выше такие запросы должны работать. -Vivek –

+0

вы можете посмотреть код спящего режима или PlayOrm, но в основном getReference просто обертывает Id без touch db, а затем удаляет распаковки и отправляет в удалении строку с идентификатором, равным этому идентификатору, поэтому чтение из базы данных не требуется. .. Иногда нет необходимости помещать его в кеш, поэтому я не уверен, почему вы ссылаетесь на кеш. –

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(); 
Смежные вопросы