问题标签 [spring-data-jpa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
spring - 如何使用 Spring JPA 进行分页 QueryDSL 查询?
QueryDSL 定义了一个接口和一个实例,可以通过调用或OrderSpecifier
轻松获得任何字段的接口和实例。Spring Data JPA的接口甚至还有一个以s 为参数的方法。asc()
desc()
QueryDslPredicateExecutor
findAll()
OrderSpecifier
org.springframework.data.domain.PageRequest
然而,对 QueryDSL 一无所知,它有自己的方式来定义查询排序顺序,即org.springframework.data.domain.Sort
. 它可以包含许多与org.springframework.data.domain.Sort.Order
s 非常相似OrderSpecifier
的 s,只是它们不是类型安全的等。
那么,如果我想进行使用排序的分页查询,真的没有办法使用 QueryDSL 来定义它吗?
eclipselink - Eclipselink 和 Spring 数据
我正在尝试使用 eclipselink (2.4.0) 和 spring-data-jpa (1.1.0.RELEASE) 的组合来实现解决方案。但是,每次部署解决方案(Tomcat 7)时,都会出现以下异常:
它似乎发生在存储库自动装配发生时(下面的代码示例):
服务等级
实体类
持久性.xml
这可能是由于spring和eclipselink之间的一些冲突吗?
更新:
堆栈跟踪...
spring - Spring Data JPA 强制 CGLib 代理到非存储库类
我正在尝试将现有的 Spring 3 JPA 2 Hibernate Web 应用程序迁移到 Spring Data JPA。但是,只需将最新的 Spring Data JPA 添加到 Maven 项目并配置 Spring Data 如下
春天开始抱怨:
请注意,Spring Data 被配置为扫描包myapp.persistence.spring
,而上面的错误引用了来自包的类myapp.persistence
。当我将 CGlib 添加到项目中时,包括 Spring Data 在内的所有内容都可以正常工作。但发生了什么事?我是春季菜鸟,很困惑。我无法弄清楚 Spring Data 是如何发挥它的代理魔力的。至少官方的例子根本不包括 CGlib。更多的信息:
CompanyRepository
是一个使用EntityManager的简单自制JPA-DAO:
事务通过@Transactional
AspectJ 编译时编织启用。上下文配置片段:
部署到 Tomcat 7.0.27
hibernate - Spring JPA 休眠 OneToOne
我一直试图解决这个问题很长一段时间没有成功。我在用:
- 春天 3.1.1
- 休眠 4.0.1.Final
- spring-data-jpa 1.0.2.RELEASE
- MySQL 5 (org.hibernate.dialect.MySQL5InnoDBDialect)
我有两个实体,具有 OneToOne 非定向关联。表之间没有外键关系
和另一个我不想被级联删除/任何东西作为参考的类
每个表都有 userRoleId 声明为 bigint
我有两个存储库:
和
但是,当我构建它时,出现以下错误:
这似乎是一种非常简单的映射方式,但我看到的所有示例都是双向的。不过,我不明白为什么这不起作用。
spring - Spring数据+休眠
我正在使用 Spring Data 和 Hibernate,当我尝试使用 set id 保存实体时出现错误:
请帮助我如何通过 JpaRepositories 更新实体或我错过了什么配置?
持久性.xml:
春天的背景:
我在另一个项目中使用了 OpenJpa 并且没有这样的问题:如果实体设置了 ID,则“保存”方法确实创建和更新。那么如何更新对象呢?我应该实现自己的更新方法吗?
测试失败:
hql - 弹簧数据查询
这是我的代码。第一种方法效果很好,但第二种方法不行。谁能告诉我如何使它正确?
spring-data - 管理来自多个表的数据 Spring data JPA
在应用程序中使用 Spring Data JPA 时,您通常会定义实体 (@Entity) 并编写存储库接口(扩展 CrudRepository)并执行一些超出此问题范围的额外配置。
例如,
现在,如果我有多个像上面这样的实体并且需要设计一个像 searchByProductAndUserAndLocation 这样的服务 API(比如说所有三个都是数据库表),我应该如何在 Spring data JPA 中这样做?假设我也为 Quantity/Cost 编写实体类。显然,我需要根据某些条件(使用外键)加入表,但我不清楚哪个存储库应该保存此类查询,因为我觉得这里没有特定的所有者存储库/类。
此外,我可以通过 ProductService、LocationService 等公开数据,然后组合结果,但我不会使用数据库层连接或其他最终影响应用程序性能的优化。
我确定这是一个非常常见的用例,一般做法是什么?
提前致谢。
java - 当对象不在持久性上下文中时,休眠合并不查询数据库
我在用着:
- 春天 3.1
- 春季数据 JPA 1.1
- 休眠 4.1
我有个问题。我有一个标准的 Spring Data JPA DAO:
这是Dnar
代码:
还有一个实现类的例子:
另外,这是我的 Hibernate 的 Spring 配置:
第一轮 - 问题
DAO 的客户端是DnarManagerImpl
类:
上面的代码有效,但它总是在数据库中创建一个新dnar
行。我已经调试了 Spring Data JPA 代码,它似乎工作正常。例如,如果我保存同一个对象 3 次,那么 Hibernate 调用是:
getSession().persist(entity);
getSession().merge(entity);
getSession().merge(entity);
Hibernate 为上述输出的 SQL 是:
- 插入 ...
- 插入 ...
- 插入 ...
第 2 轮 - 黑客修复
通过一些实验,我发现我可以通过使用来告诉当前会话该实体存在dnarDao.findOne(id);
。这解决了我的问题:
Hibernate 会话调用再次是:
getSession().persist(entity);
getSession().merge(entity);
getSession().merge(entity);
Hibernate 输出的 SQL 现在是正确的:
- 插入 ...
- 更新 ...
- 更新 ...
问题
根据Hibernate docs,这是如何merge()
工作的:
- 如果存在与当前与持久性上下文关联的具有相同标识符的托管实例,则将给定对象的状态复制到托管实例上
- 如果当前没有与持久性上下文关联的托管实例,请尝试从数据库中加载它,或者创建一个新的托管实例
- 返回托管实例
- 给定的实例没有与持久化上下文相关联,它保持分离并且通常被丢弃
显然,在我的示例中,第 2 项没有发生。Hibernate 不会尝试从数据库中加载此实体。Hibernate从不输出选择(我的 hack 修复中的例外)。Sooo....我哪里错了?我确信 Hibernate 确实按照文档工作,只是我做了一些愚蠢的事情。
java - 如何将自定义方法添加到 Spring Data JPA
我正在研究 Spring Data JPA。考虑下面的示例,在该示例中,我将默认使用所有 crud 和 finder 功能,如果我想自定义一个 finder,那么这也可以在界面本身中轻松完成。
我想知道如何为上述 AccountRepository 添加一个完整的自定义方法及其实现?由于它是一个接口,我无法在那里实现该方法。
java - 如何使用 spring-data-jpa 更新实体?
好吧,这个问题几乎说明了一切。使用 JPARepository 如何更新实体?
JPARepository 只有一个保存方法,它并没有告诉我它实际上是创建还是更新。例如,我向数据库 User 中插入了一个简单的 Object,它具有三个字段firstname
:lastname
和age
:
然后我简单地调用save()
,此时它实际上是插入数据库:
到现在为止还挺好。现在我想更新这个用户,比如改变他的年龄。为此,我可以使用查询,无论是 QueryDSL 还是 NamedQuery。但是,考虑到我只想使用 spring-data-jpa 和 JPARepository,我该如何告诉它我想要更新而不是插入?
具体来说,我如何告诉 spring-data-jpa 具有相同用户名和名字的用户实际上是 EQUAL 并且应该更新现有实体?覆盖 equals 并没有解决这个问题。