标签: spring-data-jpa

为什么在Spring Data JPA Repository上的save()之后使用返回的实例?

这是代码:

@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)

java spring jpa spring-data spring-data-jpa

55
推荐指数
2
解决办法
5万
查看次数

spring data jpa @query和pageable

我正在使用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)

java spring hibernate jpa spring-data-jpa

54
推荐指数
5
解决办法
7万
查看次数

具有分页的Spring Data和Native Query

在一个Web项目中,使用最新的spring-data(1.10.2)和MySQL 5.6数据库,我正在尝试使用带有分页的本机查询,但我org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException在启动时遇到了问题.

更新:20180306此问题现已在Spring 2.0.4中修复.对于那些仍然感兴趣或坚持使用旧版本的用户,请查看相关的答案和注释以获取解决方法.

根据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)

spring spring-data spring-data-jpa

52
推荐指数
8
解决办法
7万
查看次数

了解Spring Data JPA @NoRepositoryBean接口

@NoRepositoryBean在阅读Spring Data文档时,我多次遇到界面.

引用文档:

如果您正在使用Spring命名空间使用Spring命名空间进行自动存储库接口检测,那将导致Spring尝试创建MyRepository实例.这当然不是所希望的,因为它只是在Repository和您要为每个实体定义的实际存储库接口之间起中间作用.要将扩展存储库的接口排除在实例化为存储库实例之外,请使用@NoRepositoryBean.

但是,我仍然不确定何时何地使用它.有人可以建议并给我一个具体的用法示例吗?

java spring jpa spring-data spring-data-jpa

51
推荐指数
2
解决办法
3万
查看次数

JPA:仅更新特定字段

是否有更新的方式只有一些领域使用该方法的实体对象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)

java spring jpa spring-data-jpa

51
推荐指数
4
解决办法
5万
查看次数

JpaRepository不支持DML操作[删除查询]

我在扩展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)

java spring hibernate hql spring-data-jpa

51
推荐指数
3
解决办法
4万
查看次数

带参数属性的Spring数据JPA查询

声明使用输入参数属性作为查询参数的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参数上指定属性名称.

什么是最好的选择?}

spring jpa spring-data spring-data-jpa

50
推荐指数
5
解决办法
9万
查看次数

Spring Data Rest - 按多个属性排序

我有一个实体如下

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)

有没有办法指定多个排序顺序?

谢谢!

spring spring-data spring-data-jpa spring-data-rest

50
推荐指数
2
解决办法
4万
查看次数

使用Spring Data JPA查找实体时如何启用LockModeType.PESSIMISTIC_WRITE?

如何实现此代码的等价物:

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 …

java spring jpa spring-data spring-data-jpa

49
推荐指数
3
解决办法
5万
查看次数

Spring Boot Data JPA - 修改更新查询 - 刷新持久性上下文

我正在使用Spring Boot 1.3.0.M4和MySQL数据库.

我在使用修改查询时遇到问题,EntityManager在执行查询后包含过时的实体.

原始JPA存储库:

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)

解决问题的第一种方法:添加clearAutomatically = true

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 hibernate spring-data spring-data-jpa spring-boot

48
推荐指数
1
解决办法
2万
查看次数