Нравится это:
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 в отдельности.
Я использую 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"/>
Это было длинное путешествие, но я наконец-то получил его. Надеюсь, это поможет кому-то, пытаясь «оплатить его», поскольку многие другие помогли мне с их замечательными блогами, ответами и комментариями.
Для меня это работало со следующими аннотациями:
@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids") List<Long> ids);
Чтобы выполнить модификацию запросов, вам необходимо аннотировать метод с дополнительным @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);
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);
@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