Tag: spring data jpa

Spring数据CrudRepository和悲观锁

我正在使用 Spring Boot 1.4.2 Spring Data JPA 1.10.5 PostgreSQL 9.5数据库 我希望在我的Spring Data存储库中有一个带悲观锁的findOne方法,该方法与已经提供的findOne方法分开。 根据这个答案,我写道: public interface RegistrationRepository extends CrudRepository { @Lock(LockModeType.PESSIMISTIC_WRITE) @Query(“select r from Registration r where r.id = ?1”) Registration findOnePessimistic(Long id); } 这几乎可行。 不幸的是,这不会刷新实体管理器缓存中我的实体的先前实例。 我有两个并发请求更新我的注册状态 第二个等待第一个事务的提交 第二个没有考虑第一个的变化。 因此破坏了行为。 任何线索为什么@Lock没有开箱即用刷新实体管理器? 更新 这是请求的示例代码: public interface RegistrationRepository extends CrudRepository { @Lock(LockModeType.PESSIMISTIC_WRITE) @Query(“select r from registration_table r where […]

如何基于实体接口声明存储库?

在一个新项目中,我们希望使用Spring Data JPA并为所有JPA实体定义接口,例如: public interface Person extends Serializable { void setId(Long id); Long getId(); void setLastName(String lastName); String getLastName(); void setFirstName(String firstName); String getFirstName(); // … } @Entity @Table(name = “t_persons”) public class PersonEntity implements Person { private static final long serialVersionUID = 1L; @Id @Column @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column private String […]

JPQL中的LIMIT子句替代是什么?

我正在使用JPQL中的PostgreSQL查询实现。 这是一个原生psql查询示例,工作正常, SELECT * FROM students ORDER BY id DESC LIMIT 1; JPQL中的相同查询不起作用, @Query(“SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1”) Students getLastStudentDetails(); 似乎LIMIT子句在JPQL中不起作用。 根据JPA文档,我们可以使用setMaxResults/setFirstResult ,任何人都可以告诉我如何在上面的查询中使用它?

Spring Data仅使用Date查询DateTime

我有这个数据模型 public class CustomerModel{ @Column @Type(type=”org.joda.time.contrib.hibernate.PersistentDateTime”) private DateTime membershipDate; //Other properties and getters } 以下回购 public interface CustomerRepo extends Repository{} 我想做的是。 检索给定日期的所有用户,例如(2013年8月1日加入的成员)但问题是在我的数据库中,membershipDate有时间。 如何忽略时间并检索给定日期的所有用户?

Spring Data Rest ManytoMany POST

首先,让我解释一下我的用例。 这很直接。 有一个用户实体和一个服务实体。 我使用UserService作为连接实体(连接表)在User和Service之间有很多关联。最初,会有一些用户和一些服务集。 用户可以随时订阅任何服务。 在这种情况下,将向UserService添加一个条目。 但是,当我尝试创建一个新的UserService关联时,我得到空指针exception。 我可以单独创建用户和服务。 我的实体是:User.java package dao.models; import java.io.Serializable; import javax.persistence.*; import com.fasterxml.jackson.annotation.JsonBackReference; @Entity @org.hibernate.annotations.Proxy(lazy=false) @Table(name=”`user`”, schema=”emm”) public class User implements Serializable { public User() { } @Column(name=”id”, nullable=false, unique=true) @Id @GeneratedValue(generator=”EMM_USER_ID_GENERATOR”) @org.hibernate.annotations.GenericGenerator(name=”EMM_USER_ID_GENERATOR”, strategy=”native”) private long id; @ManyToOne(targetEntity=dao.models.Tenant.class, fetch=FetchType.LAZY) @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK}) @JoinColumns({ @JoinColumn(name=”tenant_id”, referencedColumnName=”id”, nullable=false) }) @org.hibernate.annotations.LazyToOne(value=org.hibernate.annotations.LazyToOneOption.NO_PROXY) private dao.models.Tenant tenant; @OneToOne(targetEntity=dao.models.Person.class, fetch=FetchType.LAZY) […]

Spring Boot 1.4 @DataJpaTest – 创建名为’dataSource’的bean时出错

我已经创建了一个新的spring boot 1.4应用程序,希望尝试使用@DataJpaTest进行一些测试,但不断收到以下错误消息 引起:org.springframework.beans.factory.BeanCreationException:创建名为’dataSource’的bean时出错:init方法的调用失败; 嵌套exception是java.lang.IllegalStateException:无法确定测试的嵌入式数据库。 如果您想要一个嵌入式数据库,请在类路径上放置一个受支持的数据库。 SRC /主/资源/ application.properties spring.datasource.url=jdbc:mysql://localhost/my_db spring.datasource.username=user spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.jdbc.Driver MyRepositoryTest @RunWith(SpringRunner.class) @DataJpaTest final public class MyRepositoryTest { } 的build.gradle dependencies { compile ‘org.springframework.boot:spring-boot-starter-web’, ‘org.springframework.boot:spring-boot-starter-data-jpa’, ‘mysql:mysql-connector-java’, ‘org.projectlombok:lombok:1.16.10’ testCompile(‘org.springframework.boot:spring-boot-starter-test’) } 我有什么想法吗?

具有多个条件的QueryDSL Predicate SetPath.any

我有一个简单的实体,有一对多的关系 @Entity // and other @ stuff public class Member { @Id private Long id; private String name; private List programs; … } @Entity public class Program { @Id private Long id; private Long programName; private ProgramType programType; private Long programCost; … } 现在使用QueryDSL,我想查询’所有成员注册的程序,其中programType =“FULLTIME”和programCost> $ 1000′ 我使用了以下谓词 Predicate predicate = QMember.member.programs.any() .programType.eq(ProgramType.FULLTIME) .and(QMember.member.programs.any().programCost.gt(1000)); 使用JPARepository […]

Spring Data JPA – 如何以编程方式设置JpaRepository基础包

在Spring Java Config类中定义EntityManager时,我可以通过调用相应构建器上的方法来添加基础包以扫描Entity类: public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) { // Some other configuration here builder.packages(“org.foo.bar”, “org.foo.baz”); return builder.build(); } 我需要一些类似于Spring寻找存储库接口的地方。 通常的方法是使用@EnableJpaRepositories注释: @EnableJpaRepositories(basePackages = {“org.foo.barbaz”}) 但是我希望有一种动态的方式来定义这些包,类似于上面对Entity位置的方式。 像这样的东西: public SomeJpaRepositoryFactoryBean entityManagerFactory(JpaRepositoryFactoryBuilder builder) { // Some other configuration here builder.packages(“org.foo.barbaz”); return builder.build(); } 有没有办法用当前的Spring Data JPA版本执行此操作,这是不是意味着这样做?

如何使用Spring Data Rest和PagingAndSortingRepository处理exception?

假设我有一个类似的存储库: public interface MyRepository extends PagingAndSortingRepository { @Query(“….”) Page findByCustomField(@Param(“customField”) String customField, Pageable pageable); } 这很好用。 但是,如果客户端发送已形成的请求(例如,搜索不存在的字段),则Spring将exception作为JSON返回。 揭示@Query等 // This is OK http://example.com/data-rest/search/findByCustomField?customField=ABC // This is also OK because “secondField” is a valid column and is mapped via the Query http://example.com/data-rest/search/findByCustomField?customField=ABC&sort=secondField // This throws an exception and sends the exception to the client http://example.com/data-rest/search/findByCustomField?customField=ABC&sort=blahblah 抛出exception并发送给客户端的示例: […]

Spring Data JPA删除本机查询抛出exception

我有一个User实体和一个Role实体。 关系定义如下: @OneToMany @JoinTable(name=”USER_ROLES”, inverseJoinColumns=@JoinColumn(name=”ROLE_ID”)) private List roles = null; 现在,当我删除一个角色时,我需要从拥有该角色的所有用户中删除该角色。 通常,您可以通过查找具有此角色的所有用户,从列表中删除角色以及保存用户来执行此类操作。 但是,当可能有超过一百万用户时,我不想在应用程序中循环这么多实体。 所以,我想使用本机查询从USER_ROLES连接表中删除行。 我尝试将其添加到我的存储库: @Query(value=”DELETE FROM user_roles WHERE role_id = ?1″, nativeQuery=true) public void deleteRoleFromUsersWithRole(Long roleId); 但是,当我这样做时,我在日志中看到以下内容: [EL Fine]: sql: 2013-11-02 14:27:14.418–ClientSession(707349235)–Connection(2096606500)–Thread(Thread[http-bio-8080-exec-4,5,main])–DELETE FROM user_roles WHERE role_id = ? bind => [1000110139999999953] [EL Fine]: sql: 2013-11-02 14:27:14.478–ClientSession(707349235)–Thread(Thread[http-bio-8080-exec-4,5,main])–SELECT 1 [EL Warning]: 2013-11-02 14:27:14.482–UnitOfWork(1795045370)–Thread(Thread[http-bio-8080-exec-4,5,main])–Exception [EclipseLink-4002] (Eclipse Persistence […]