这是代码:
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {}
Run Code Online (Sandbox Code Playgroud)
来自Spring Data JPA项目的JpaRepository.
这是测试代码:
public class JpaAccountRepositoryTest extends JpaRepositoryTest {
@Inject
private AccountRepository accountRepository;
@Inject
private Account account;
@Test
@Transactional
public void createAccount() {
Account returnedAccount = accountRepository.save(account);
System.out.printf("account ID is %d and for returned account ID is %d\n", account.getId(), returnedAccount.getId());
}
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
account ID is 0 and for returned account ID is 1
Run Code Online (Sandbox Code Playgroud)
这是来自CrudReporsitory.save()javadoc:
保存给定的实体.使用返回的实例进行进一步操作,因为save操作可能已完全更改了实体实例.
以下是Spring Data JPA中SimpleJpaRepository的实际代码:
@Transactional
public T save(T entity) {
if (entityInformation.isNew(entity)) { …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Data JPA,当我@Query用来定义查询WITHOUT时 Pageable,它可以工作:
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
nativeQuery = true)
List<UrnMapping> fullTextSearch(String text);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我添加第二个参数Pageable,那么@Query它将不起作用,Spring将解析方法的名称,然后抛出异常 No property full found.这是一个错误吗?
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
nativeQuery = true)
Page<UrnMapping> fullTextSearch(String text, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud) 在一个Web项目中,使用最新的spring-data(1.10.2)和MySQL 5.6数据库,我正在尝试使用带有分页的本机查询,但我org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException在启动时遇到了问题.
根据Spring-data文档中使用@Query的示例50,可以指定查询本身和countQuery,如下所示:
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
出于好奇,在NativeJpaQuery课堂上我可以看到它包含以下代码来检查它是否是一个有效的jpa查询:
public NativeJpaQuery(JpaQueryMethod method, EntityManager em, String queryString, EvaluationContextProvider evaluationContextProvider, SpelExpressionParser parser) {
super(method, em, queryString, evaluationContextProvider, parser);
JpaParameters parameters = method.getParameters();
boolean hasPagingOrSortingParameter = parameters.hasPageableParameter() || parameters.hasSortParameter();
boolean containsPageableOrSortInQueryExpression …Run Code Online (Sandbox Code Playgroud) @NoRepositoryBean在阅读Spring Data文档时,我多次遇到界面.
引用文档:
如果您正在使用Spring命名空间使用Spring命名空间进行自动存储库接口检测,那将导致Spring尝试创建MyRepository实例.这当然不是所希望的,因为它只是在Repository和您要为每个实体定义的实际存储库接口之间起中间作用.要将扩展存储库的接口排除在实例化为存储库实例之外,请使用
@NoRepositoryBean.
但是,我仍然不确定何时何地使用它.有人可以建议并给我一个具体的用法示例吗?
是否有更新的方式只有一些领域使用该方法的实体对象save从春数据JPA?
例如,我有一个像这样的JPA实体:
@Entity
public class User {
@Id
private Long id;
@NotNull
private String login;
@Id
private String name;
// getter / setter
// ...
}
Run Code Online (Sandbox Code Playgroud)
凭借其CRUD回购:
public interface UserRepository extends CrudRepository<User, Long> { }
Run Code Online (Sandbox Code Playgroud)
在Spring MVC中,我有一个控制器,它获取一个User对象来进行更新:
@RequestMapping(value = "/rest/user", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<?> updateUser(@RequestBody User user) {
// Assuming that user have its id and it is already stored in the database,
// and …Run Code Online (Sandbox Code Playgroud) 我在扩展JPaRepository的界面中编写了一个删除某些对象的查询,但是当我执行查询时它抛出异常!谁能为我解释一下,并提前谢谢你:)
查询:
public interface LimitRepository extends JpaRepository<CLimit, Long> {
@Query("delete from CLimit l where l.trader.id =:#{#trader.id}")
void deleteLimitsByTrader(@Param("trader") CTrader trader);
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误,可以任意请,为我解释一下,谢谢大家:)
例外:
org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.query.domain.CLimit l where l.trader.id =:__$synthetic$__1]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.errorIfDML(QueryTranslatorImpl.java:318)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:369)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:364)
at com.sun.proxy.$Proxy98.getSingleResult(Unknown Source)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:206)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:102)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:92)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) …Run Code Online (Sandbox Code Playgroud) 声明使用输入参数属性作为查询参数的Spring数据JPA查询的最简单方法是什么?
例如,假设我有一个实体类:
public class Person {
@Id
private long id;
@Column
private String forename;
@Column
private String surname;
}
Run Code Online (Sandbox Code Playgroud)
和另一课:
public class Name {
private String forename;
private String surname;
[constructor and getters]
}
Run Code Online (Sandbox Code Playgroud)
...然后我想编写一个Spring数据存储库,如下所示:
public interface PersonRepository extends CrudRepository<Person, Long> {
@Query("select p from Person p where p.forename = ?1.forename and p.surname = ?1.surname")
findByName(Name name);
}
Run Code Online (Sandbox Code Playgroud)
...但是Spring数据/ JPA不喜欢我在?1参数上指定属性名称.
什么是最好的选择?}
我有一个实体如下
Class Person{
String id;
String name;
String numberOfHands;
}
Run Code Online (Sandbox Code Playgroud)
使用Spring Data Rest(Gosling Release Train),我可以指定
localhost/Person?sort=name,asc
Run Code Online (Sandbox Code Playgroud)
用于排序名称升序.现在,在我需要按numberOfHands降序排序并命名升序的情况下.我可以指定
localhost/Person?sort=numberOfHands,name,asc
Run Code Online (Sandbox Code Playgroud)
但是,我无法指定
localhost/Person?sort=numberOfHands,desc,name,asc
Run Code Online (Sandbox Code Playgroud)
有没有办法指定多个排序顺序?
谢谢!
如何实现此代码的等价物:
tx.begin();
Widget w = em.find(Widget.class, 1L, LockModeType.PESSIMISTIC_WRITE);
w.decrementBy(4);
em.flush();
tx.commit();
Run Code Online (Sandbox Code Playgroud)
...但是使用Spring和Spring-Data-JPA注释?
我现有代码的基础是:
@Service
@Transactional(readOnly = true)
public class WidgetServiceImpl implements WidgetService
{
/** The spring-data widget repository which extends CrudRepository<Widget, Long>. */
@Autowired
private WidgetRepository repo;
@Transactional(readOnly = false)
public void updateWidgetStock(Long id, int count)
{
Widget w = this.repo.findOne(id);
w.decrementBy(4);
this.repo.save(w);
}
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何指定updateWidgetStock方法中的所有内容都应该使用悲观的锁定集来完成.
有一个Spring Data JPA注释org.springframework.data.jpa.repository.Lock允许你设置一个LockModeType,但我不知道将它放在updateWidgetStock方法上是否有效.这听起来更像是一个注释WidgetRepository,因为Javadoc说:
org.springframework.data.jpa.repository
@Target(value = METHOD)
@Retention(value = RUNTIME)
@Documented
public @interface Lock …
我正在使用Spring Boot 1.3.0.M4和MySQL数据库.
我在使用修改查询时遇到问题,EntityManager在执行查询后包含过时的实体.
public interface EmailRepository extends JpaRepository<Email, Long> {
@Transactional
@Modifying
@Query("update Email e set e.active = false where e.active = true and e.expire <= NOW()")
Integer deactivateByExpired();
}
Run Code Online (Sandbox Code Playgroud)
假设我们在DB中有Email [id = 1,active = true,expire = 2015/01/01].
执行后:
emailRepository.save(email);
emailRepository.deactivateByExpired();
System.out.println(emailRepository.findOne(1L).isActive()); // prints true!! it should print false
Run Code Online (Sandbox Code Playgroud)
public interface EmailRepository extends JpaRepository<Email, Long> {
@Transactional
@Modifying(clearAutomatically = true)
@Query("update Email e set e.active = false where e.active = true and …Run Code Online (Sandbox Code Playgroud) spring ×10
spring-data-jpa ×10
spring-data ×7
java ×6
jpa ×6
hibernate ×3
hql ×1
spring-boot ×1