标签: spring-data

具有分页的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万
查看次数

带参数属性的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万
查看次数

PageRequest构造函数已被弃用

我正在使用Spring Data Commons v2 +快照,我发现a的构造函数PageRequest已被弃用.这似乎发生在M1M2之间.不幸的是,这是Pageable界面的唯一[真实]实现.我想知道努力的方向,以及当前发展的更好选择.

java spring spring-data spring-data-commons

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

Spring Data JPA Update @Query没有更新?

我有一个更新查询:

@Modifying
@Transactional
@Query("UPDATE Admin SET firstname = :firstname, lastname = :lastname, login = :login, superAdmin = :superAdmin, preferenceAdmin = :preferenceAdmin, address =  :address, zipCode = :zipCode, city = :city, country = :country, email = :email, profile = :profile, postLoginUrl = :postLoginUrl WHERE id = :id")
public void update(@Param("firstname") String firstname, @Param("lastname") String lastname, @Param("login") String login, @Param("superAdmin") boolean superAdmin, @Param("preferenceAdmin") boolean preferenceAdmin, @Param("address") String address, @Param("zipCode") String zipCode, @Param("city") String city, @Param("country") String country, @Param("email") String email, @Param("profile") String …
Run Code Online (Sandbox Code Playgroud)

java jpa spring-data

47
推荐指数
3
解决办法
12万
查看次数

使用Spring JPA处理软删除

我有一个表Stuff定义为......

id, <fields>..., active
Run Code Online (Sandbox Code Playgroud)

Active是软删除标志,总是10.从长远来看,这可能会有利于历史表.

public interface StuffRepository extends JpaRepository<StuffEntity, Long> {} 
Run Code Online (Sandbox Code Playgroud)

在代码中,我们总是 使用活动记录.有没有办法让Spring始终active=1为为此存储库生成的查询附加条件?或者更理想的是允许我扩展用于生成查询的语法?

我知道我可以@queues在任何地方创建命名,但后来我失去了生成的查询的便利性.我还想避免使用"主动"方法污染接口.

我正在使用Hibernate 4.2作为我的JPA实现,如果这很重要的话.

java spring jpa spring-data spring-data-jpa

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

Spring Data JPA和Exists查询

我正在使用Spring Data JPA(Hibernate作为我的JPA提供程序)并且想要定义exists附加了HQL查询的方法:

public interface MyEntityRepository extends CrudRepository<MyEntity, String> {

  @Query("select count(e) from MyEntity e where ...")
  public boolean existsIfBlaBla(@Param("id") String id);

}
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,我得到了一个java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Boolean.

HQL查询如何使其工作?我知道我可以简单地返回一个Long值,然后检查我的Java代码是否count > 0,但是这个解决方法不应该是必要的,对吧?

java hibernate jpa jpql spring-data

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