我正在使用Spring JPA来执行所有数据库操作.但是我不知道如何从Spring JPA中的表中选择特定的列?
例如:
SELECT projectId, projectName FROM projects
我想要一个UserRepository在Spring Data的帮助下创建的存储库(比方说).我是spring-data(但不是spring)的新手,我使用的是本教程.我选择处理数据库的技术是JPA 2.1和Hibernate.问题是我对如何为这样的存储库编写单元测试一无所知.
我们以create()方法为例.当我正在测试时,我应该为它编写单元测试 - 这就是我遇到的三个问题:
首先,如何将一个模拟注入EntityManager一个UserRepository接口的不存在的实现?Spring Data将基于此接口生成实现:
public interface UserRepository extends CrudRepository<User, Long> {}
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何强制它使用EntityManager模拟和其他模拟 - 如果我自己编写了实现,我可能会有一个setter方法EntityManager,允许我使用我的模拟进行单元测试.(至于实际的数据库连接,我有一个JpaConfiguration类,有注释@Configuration和@EnableJpaRepositories,通过编程定义豆类DataSource,EntityManagerFactory,EntityManager等等-但库应该是测试友好,并允许重写这些事情).
其次,我应该测试互动吗?这是我很难找出什么方法EntityManager和Query应该被称为(类似于那个verify(entityManager).createNamedQuery(anyString()).getResultList();),因为它是不是我是谁写的实施.
第三,我是否应该首先对Spring-Data生成的方法进行单元测试?据我所知,第三方库代码不应该进行单元测试 - 只有开发人员自己编写的代码应该进行单元测试.但如果这是真的,它仍然会将第一个问题带回现场:比方说,我的存储库有几个自定义方法,我将编写实现,如何注入我的模拟EntityManager并Query进入最终,生成库?
注:我将使用测试驱动我的仓库都集成和单元测试.对于我的集成测试,我使用的是HSQL内存数据库,显然我没有使用数据库进行单元测试.
也许第四个问题,在集成测试中测试正确的对象图创建和对象图检索是否正确(比方说,我有一个用Hibernate定义的复杂对象图)?
更新:今天我继续尝试模拟注入 - 我创建了一个静态内部类来允许模拟注入.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class UserRepositoryTest {
@Configuration
@EnableJpaRepositories(basePackages = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Spring-Data-JPA合并到我的项目中.让我困惑的一件事是如何通过注释实现setMaxResults(n)?
例如,我的代码:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Run Code Online (Sandbox Code Playgroud)
我只需one (and only one)要从otherObj 返回用户,但我找不到一种方法来注释maxResults ...有人可以给我一个提示吗?
(mysql抱怨:
com.mysql.jdbc.JDBC4PreparedStatement@5add5415: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED **
WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001
ERROR util.JDBCExceptionReporter - No value specified for parameter 2
Run Code Online (Sandbox Code Playgroud)
)
我找到了一个链接:https://jira.springsource.org/browse/DATAJPA-147,我试过但失败了.现在似乎不可能?为什么Spring-Data中没有内置这么重要的功能?
如果我手动实现此功能:
public class UserRepositoryImpl implements UserRepository
Run Code Online (Sandbox Code Playgroud)
我必须实现大量的预定义方法 …
好吧,我搜索谷歌并找到了很多结果,但没有一个能够回答我的问题.所以,在这里.
我试图通过最小的pinterest clone实现来研究Spring MVC和Spring Data JPA.因此,以下是我认为与我的问题相关的代码部分.
型号/实体
@Entity
@Table(name = "pin_item")
public class PinItem implements Serializable {
// properties ...
@JoinColumn(name = "board_id", referencedColumnName = "user_board_id")
@ManyToOne(optional = false)
private UserBoard board;
// getters and setters...
}
@Entity
@Table(name = "user_board")
public class UserBoard implements Serializable {
// properties ...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "board")
private List<PinItem> pinItemList;
// getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
服务
@Service
@Transactional(readOnly = true)
public class BoardServiceImpl implements BoardService {
@Autowired
private UserBoardRepository boardRepository;
@Override …Run Code Online (Sandbox Code Playgroud) Spring Data JPA支持使用规范计算实体.但它有没有办法使用方法名称解析来计算实体?假设我想要一种方法countByName来计算具有特定名称的实体,就像findByName获取具有特定名称的所有实体的方法一样.
目前我有一个使用Spring Data REST的Spring Boot应用程序.我有一个与另一个域实体Post有@OneToMany关系的域实体Comment.这些类的结构如下:
Post.java:
@Entity
public class Post {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
private String title;
@OneToMany
private List<Comment> comments;
// Standard getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
Comment.java:
@Entity
public class Comment {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
@ManyToOne
private Post post;
// Standard getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
他们的Spring Data REST JPA存储库是以下基本实现CrudRepository:
PostRepository.java:
public interface PostRepository extends CrudRepository<Post, Long> …Run Code Online (Sandbox Code Playgroud) 我需要在Spring Data Repository中使用原始SQL,这可能吗?我看到的一切@Query都是基于实体的.
我使用Spring Boot开发两个应用程序,一个用作服务器,另一个用作客户端应用程序.但是,它们都是相同的应用程序,根据活动配置文件的功能不同.我正在使用Spring Boot的自动配置功能来配置我的应用程序.
我想在客户端应用程序上禁用所有与数据库相关的自动配置,因为它不需要数据库连接.应用程序不应尝试与数据库建立连接,也不应尝试使用任何Spring Data或Hibernate功能.启用或禁用数据库自动配置应该是有条件的,并且基于应用程序的活动配置文件.
我可以通过为各个配置文件创建两个不同的application.properties文件来实现此目的吗?
我尝试将其添加到我的属性文件中,
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
Run Code Online (Sandbox Code Playgroud)
但是,应用程序仍然尝试在启动时连接到数据库.这些排除是否足以满足我的要求?
我使用Spring JPA进行数据库访问.我能够找到像findByName和countByName这样的例子,我没有必要编写任何方法实现.我希望找到基于某些条件删除一组记录的示例.
Spring JPA是否支持deleteByName-like delete?任何指针都很受欢迎.
问候和感谢.
我想编写一个Spring Data JPA存储库接口方法签名,它可以让我找到在该实体中具有嵌入对象属性的实体.有谁知道这是否可能,如果是这样的话怎么样?
这是我的代码:
@Entity
@Table(name = "BOOK_UPDATE_QUEUE", indexes = { uniqueConstraints = @UniqueConstraint(columnNames = {
"bookId", "region" }, name = "UK01_BOOK_UPDATE_QUEUE"))
public class QueuedBook implements Serializable {
@Embedded
@NotNull
private BookId bookId;
...
}
@Embeddable
public class BookId implements Serializable {
@NotNull
@Size(min=1, max=40)
private String bookId;
@NotNull
@Enumerated(EnumType.STRING)
private Region region;
...
}
public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {
//I'd like to write a method like this, but can't figure out how to search by region,
//when …Run Code Online (Sandbox Code Playgroud) spring-data-jpa ×10
java ×7
spring ×6
jpa ×5
spring-data ×5
hibernate ×2
spring-boot ×2
unit-testing ×1