问题标签 [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.

0 投票
4 回答
5952 浏览

spring - 如何使用 Spring JPA 进行分页 QueryDSL 查询?

QueryDSL 定义了一个接口和一个实例,可以通过调用或OrderSpecifier轻松获得任何字段的接口和实例。Spring Data JPA的接口甚至还有一个以s 为参数的方法。asc()desc()QueryDslPredicateExecutorfindAll()OrderSpecifier

org.springframework.data.domain.PageRequest然而,对 QueryDSL 一无所知,它有自己的方式来定义查询排序顺序,即org.springframework.data.domain.Sort. 它可以包含许多与org.springframework.data.domain.Sort.Orders 非常相似OrderSpecifier的 s,只是它们不是类型安全的等。

那么,如果我想进行使用排序的分页查询,真的没有办法使用 QueryDSL 来定义它吗?

0 投票
4 回答
3997 浏览

eclipselink - Eclipselink 和 Spring 数据

我正在尝试使用 eclipselink (2.4.0) 和 spring-data-jpa (1.1.0.RELEASE) 的组合来实现解决方案。但是,每次部署解决方案(Tomcat 7)时,都会出现以下异常:

它似乎发生在存储库自动装配发生时(下面的代码示例):

服务等级

实体类

持久性.xml

这可能是由于spring和eclipselink之间的一些冲突吗?

更新:

堆栈跟踪...

0 投票
1 回答
3396 浏览

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:

事务通过@TransactionalAspectJ 编译时编织启用。上下文配置片段:

部署到 Tomcat 7.0.27

0 投票
1 回答
1425 浏览

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

我有两个存储库:

但是,当我构建它时,出现以下错误:

这似乎是一种非常简单的映射方式,但我看到的所有示例都是双向的。不过,我不明白为什么这不起作用。

0 投票
2 回答
6843 浏览

spring - Spring数据+休眠

我正在使用 Spring Data 和 Hibernate,当我尝试使用 set id 保存实体时出现错误:

请帮助我如何通过 JpaRepositories 更新实体或我错过了什么配置?

持久性.xml:

春天的背景:

我在另一个项目中使用了 OpenJpa 并且没有这样的问题:如果实体设置了 ID,则“保存”方法确实创建和更新。那么如何更新对象呢?我应该实现自己的更新方法吗?

测试失败:

0 投票
1 回答
1538 浏览

hql - 弹簧数据查询

这是我的代码。第一种方法效果很好,但第二种方法不行。谁能告诉我如何使它正确?

0 投票
1 回答
3813 浏览

spring-data - 管理来自多个表的数据 Spring data JPA

在应用程序中使用 Spring Data JPA 时,您通常会定义实体 (@Entity) 并编写存储库接口(扩展 CrudRepository)并执行一些超出此问题范围的额外配置。

例如,

现在,如果我有多个像上面这样的实体并且需要设计一个像 searchByProductAndUserAndLocation 这样的服务 API(比如说所有三个都是数据库表),我应该如何在 Spring data JPA 中这样做?假设我也为 Quantity/Cost 编写实体类。显然,我需要根据某些条件(使用外键)加入表,但我不清楚哪个存储库应该保存此类查询,因为我觉得这里没有特定的所有者存储库/类。

此外,我可以通过 ProductService、LocationService 等公开数据,然后组合结果,但我不会使用数据库层连接或其他最终影响应用程序性能的优化。

我确定这是一个非常常见的用例,一般做法是什么?

提前致谢。

0 投票
2 回答
2742 浏览

java - 当对象不在持久性上下文中时,休眠合并不查询数据库

我在用着:

  1. 春天 3.1
  2. 春季数据 JPA 1.1
  3. 休眠 4.1

我有个问题。我有一个标准的 Spring Data JPA DAO:

这是Dnar代码:

还有一个实现类的例子:

另外,这是我的 Hibernate 的 Spring 配置:

第一轮 - 问题

DAO 的客户端是DnarManagerImpl类:

上面的代码有效,但它总是在数据库中创建一个新dnar行。我已经调试了 Spring Data JPA 代码,它似乎工作正常。例如,如果我保存同一个对象 3 次,那么 Hibernate 调用是:

  1. getSession().persist(entity);
  2. getSession().merge(entity);
  3. getSession().merge(entity);

Hibernate 为上述输出的 SQL 是:

  1. 插入 ...
  2. 插入 ...
  3. 插入 ...

第 2 轮 - 黑客修复

通过一些实验,我发现我可以通过使用来告诉当前会话该实体存在dnarDao.findOne(id);。这解决了我的问题:

Hibernate 会话调用再次是:

  1. getSession().persist(entity);
  2. getSession().merge(entity);
  3. getSession().merge(entity);

Hibernate 输出的 SQL 现在是正确的:

  1. 插入 ...
  2. 更新 ...
  3. 更新 ...

问题

根据Hibernate docs,这是如何merge()工作的:

  1. 如果存在与当前与持久性上下文关联的具有相同标识符的托管实例,则将给定对象的状态复制到托管实例上
  2. 如果当前没有与持久性上下文关联的托管实例,请尝试从数据库中加载它,或者创建一个新的托管实例
  3. 返回托管实例
  4. 给定的实例没有与持久化上下文相关联,它保持分离并且通常被丢弃

显然,在我的示例中,第 2 项没有发生。Hibernate 不会尝试从数据库中加载此实体。Hibernate从不输出选择(我的 hack 修复中的例外)。Sooo....我哪里错了?我确信 Hibernate 确实按照文档工作,只是我做了一些愚蠢的事情。

0 投票
14 回答
215912 浏览

java - 如何将自定义方法添加到 Spring Data JPA

我正在研究 Spring Data JPA。考虑下面的示例,在该示例中,我将默认使用所有 crud 和 finder 功能,如果我想自定义一个 finder,那么这也可以在界面本身中轻松完成。

我想知道如何为上述 AccountRepository 添加一个完整的自定义方法及其实现?由于它是一个接口,我无法在那里实现该方法。

0 投票
12 回答
597929 浏览

java - 如何使用 spring-data-jpa 更新实体?

好吧,这个问题几乎说明了一切。使用 JPARepository 如何更新实体?

JPARepository 只有一个保存方法,它并没有告诉我它实际上是创建还是更新。例如,我向数据库 User 中插入了一个简单的 Object,它具有三个字段firstnamelastnameage

然后我简单地调用save(),此时它实际上是插入数据库:

到现在为止还挺好。现在我想更新这个用户,比如改变他的年龄。为此,我可以使用查询,无论是 QueryDSL 还是 NamedQuery。但是,考虑到我只想使用 spring-data-jpa 和 JPARepository,我该如何告诉它我想要更新而不是插入?

具体来说,我如何告诉 spring-data-jpa 具有相同用户名和名字的用户实际上是 EQUAL 并且应该更新现有实体?覆盖 equals 并没有解决这个问题。