Вызывается: java.lang.IllegalStateException: вызывать вызов getSingleResult () по этому запросу невозможно. Это неправильный тип запроса [duplicate]

Нравится это:

  var raw_value = 11.0;  switch (true) {case (raw_value & gt; 10.0): height = 48;  ширина = 36;  ломать;  case (raw_value & gt; 5.0): height = 40;  width = 30;  ломать;  default: height = 16;  ширина = 12;  }  

Выражения в операторе case будут оцениваться в true или false , и если это соответствует переключатель условие ... вуаля. [D5] default действует как else .

Бонус: вы можете инвертировать всю логику, просто заменив true на ] неверно . С помощью операторов if ... else if вам нужно будет редактировать каждое предложение if в отдельности.

35
задан Webnet 12 July 2013 в 13:46
поделиться

4 ответа

Я использую Spring 3.1 и Spring JPA Data. У меня была аналогичная проблема. Я постоянно получал ошибку при попытке обновить несколько записей в 1 запросе.

Итак, у меня было что-то вроде этого.

@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

Ошибка:

org.hibernate.hql.QueryExecutionRequestException: Not supported for DML operations

Итак, после поиска в Интернете какое-то время я узнал, что вам нужно добавить @Modification.

@Modifying  
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

Но потом я получил следующую ошибку:

...    
nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; 
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
...

Итак, я решил, что проблема теперь была проблемой транзакций, и я вернулся в Google, чтобы исследовать ее и выяснил, что теперь вы должны добавить @Transactional. Похоже, что @Modifying также требует @Transactional.

@Modifying  
@Transactional
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

, но затем я получил следующую ошибку:

No value for key [org.apache.commons.dbcp.BasicDataSource (...) ] bound to thread

Снова я искал Google и пришел к выводу, что моя конфигурация была неправильной, и это оказалось правдой. Мне не хватало каких-то xml-конфигураций.

<beans:bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <beans:property name="entityManagerFactory" ref="entityManagerFactory"/>
</beans:bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

Это было длинное путешествие, но я наконец-то получил его. Надеюсь, это поможет кому-то, пытаясь «оплатить его», поскольку многие другие помогли мне с их замечательными блогами, ответами и комментариями.

108
ответ дан TchiYuan 16 August 2018 в 01:00
поделиться
  • 1
    & lt; tx: аннотация, управляемая / & gt; не требуется, поскольку Spring Data автоматически применяет транзакции на основе аннотаций к интерфейсам репозитория. – Oliver Gierke 29 March 2013 в 17:23
  • 2
    также убедитесь, что аннотация импортирована из org.springframework.transaction.nnation not javax – barryku 23 September 2014 в 23:04
  • 3
    Я использую точно такую ​​же конфигурацию со следующим классом с репозитаром Spring JPA, но получаю ошибку при создании bean-компонента. (Не определенная ошибка, он просто говорит, что репозиторий не может быть создан). Почему это так? @Repository interface IContactRepository extends PagingAndSortingRepository<Contact, Long> { @Modifying @Query("delete from Contact c where c.circle.id = :circleId") void deleteAllMembersOf(@Param("circleId") Long circleId); } – noego 4 March 2015 в 00:07
  • 4
    ИДЕАЛЬНЫЙ ОТВЕТ !! Большое спасибо ! – LETOURNEUR Léo 13 April 2017 в 11:47

Для меня это работало со следующими аннотациями:

@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids")  List<Long> ids);
4
ответ дан Celtic 16 August 2018 в 01:00
поделиться

Чтобы выполнить модификацию запросов, вам необходимо аннотировать метод с дополнительным @Modifying, как описано в справочной документации следующим образом:

@Modifying
@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                     @Param("section") String section);
9
ответ дан Oliver Gierke 16 August 2018 в 01:00
поделиться
  • 1
    Так ... это сработало для вас или нет? Я немного озадачен тем, что вы говорите;) – Oliver Gierke 22 April 2012 в 10:08
  • 2
    извините, Оливер, немного устал, и я сделал опечатку. Нет, это не помогло. Я понимаю, что этот параметр & quot; @ Modifying & quot; полезно, если ваш репозиторий аннотируется только для чтения. Таким образом, вы можете иметь репозиторий, который в основном доступен только для чтения, но он все же позволяет вам использовать в нем методы записи. – aki 25 April 2012 в 16:12
  • 3
    Это не имеет никакого отношения к readOnly - по крайней мере, не напрямую. readOnly относится к транзакциям, @Modifying - о вызове на EntityManager. Конечно, нет смысла пытаться выполнить метод модификации в транзакции только для чтения. – Oliver Gierke 26 April 2012 в 08:52

Для меня тоже он работал со следующими аннотациями:

@Modifying
@Query("update User u set u.active=1 where a.id=?1")
@Transactional
void  activeUser(Long id);
7
ответ дан Tanja 16 August 2018 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: