我有一个Media实体,它有一些用户上传文件的基本字段.为了保存上传文件的字节,我想创建一个包含该功能的自定义存储库.按照Spring文档中的步骤,我创建了一个如下所示的界面:
public interface MediaBytesRepository
{
public byte[] getBytes(Media media) throws IOException;
public void saveBytes(Media media, byte[] bytes) throws IOException;
public void appendBytes(Media media, byte[] bytes) throws IOException;
public void deleteBytes(Media media) throws IOException;
public boolean bytesExist(Media media) throws IOException;
}
Run Code Online (Sandbox Code Playgroud)
然后我提供了一个名为的接口的实现 MediaBytesRepositoryImpl
有了这个,我创建了以下界面:
public interface MediaRepository extends JpaRepository<Media, Long>, MediaBytesRepository
{
}
Run Code Online (Sandbox Code Playgroud)
现在,当我启动服务器时,我得到以下堆栈跟踪:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mediaRepository': FactoryBean threw exception on object creation; …Run Code Online (Sandbox Code Playgroud) 我正在尝试根据参考4.4自定义实现实现自定义查询:
Spring Data的MongoTemplate和MongoRepository有什么区别?
我这样做是因为我需要使用mongoTemplate进行特殊查询.
我得到的错误是一个PropertyReferenceException.所以spring-data似乎试图自动生成我不想要的查询.我想使用自己的自定义查询.
org.springframework.data.mapping.PropertyReferenceException: No property search found for type com.eerra.core.common.dto.User
Run Code Online (Sandbox Code Playgroud)
这里也描述了这个问题,但解决方案对我来说似乎不起作用:
http://forum.springsource.org/showthread.php?114454-Custom-repository-functionality
题
如果没有spring-data尝试自动生成查询,如何实现自定义查询接口和实现?
组态
弹簧配置
弹簧data.xml中
<!-- Spring Data MongoDB repository support -->
<mongo:repositories base-package="com.eerra.*.common.service" />
Run Code Online (Sandbox Code Playgroud)
存储库类和接口位于以下包中:
com.eerra.core.common.service.UserRepositoryInterface.java com.eerra.core.common.service.UserRepoistoryCustom.java(interface)com.eerra.core.common.service.UserRepositoryCustomImpl.java(implementation)
UserRepositoryCustom.java
public interface UserRepositoryCustom {
List<User> searchAllUsers();
}
Run Code Online (Sandbox Code Playgroud)
UserRepositoryCustomImpl.java
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public List<User> searchAllUsers() {
return mongoTemplate.findAll(User.class);
}
}
Run Code Online (Sandbox Code Playgroud)
UserRepositoryInterface.java
@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String>, UserRepositoryCustom {
User findByEmail(String email);
List<User> findByEmailLike(String email);
List<User> findByEmailOrLastName(String …Run Code Online (Sandbox Code Playgroud) 这是我第一次在 Java 中使用 Mongo,我在这个聚合查询中遇到了一些问题。我可以在 Mongo for Spring 中做一些简单的查询,并@Query在我的 Repository 接口中添加注释,它扩展了MongoRepository<T, ID>. 了解在 Spring-Data 中进行长聚合时采用哪种方法会很有帮助。
db.post.aggregate([
{
$match: {}
},
{
$lookup: {
from: "users",
localField: "postedBy",
foreignField: "_id",
as: "user"
}
},
{
$group: {
_id: {
username: "$user.name",
title: "$title",
description: "$description",
upvotes: { $size: "$upvotesBy" },
upvotesBy: "$upvotesBy",
isUpvoted: { $in: [req.query.userId, "$upvotesBy"] },
isPinned: {
$cond: {
if: { $gte: [{ $size: "$upvotesBy" }, 3] },
then: true,
else: false
}
},
file: …Run Code Online (Sandbox Code Playgroud) 我使用了 MongoTemplate 的 findAndModify 方法,如下所示,
public Organization findAndModifyOrganization(Integer orgId, String name, Integer empId)
{
Query query = new Query();
query.addCriteria(Criteria.where("employees.id").is(empId));
query.addCriteria(Criteria.where("id").is(orgId));
Update update = new Update();
update.set("employees.$.name", name);
Organization org = mongoTemplate.findAndModify(query, update, new FindAndModifyOptions().returnNew(true), Organization.class);
return org;
}
Run Code Online (Sandbox Code Playgroud)
//类结构
@Document
public class Organization {
private Integer id;
private List<Employee> employees;
}
@Document
public class Employee {
private Integer id;
private String name;
}
Run Code Online (Sandbox Code Playgroud)
我想使用 Spring Data MongoRepository 方法来实现上述目标。请告诉我如何使用 MongoRepository 方法更新员工姓名。
在我的项目中,我们使用的是 Spring 注入的 MongoTemplate
private final MongoTemplate mongoTemplate;
Run Code Online (Sandbox Code Playgroud)
我知道 mongo 模板实现了 MongoOperations、ApplicationContextAware,所以我们通过模板获得了上下文感知方法,如果我使用如下所示的 mongo 操作类型对象,我们就不会得到这种方法(spring 将在其中注入 mongo 模板对象)
private final MongoOperations mongoOperations;
Run Code Online (Sandbox Code Playgroud)
我的疑问是 1. 我们这样做是否违反了“编程接口”范式 2. 我们应该使用哪种模式,为什么?
如果使用MongoRepository,您可以拥有以下代码:
@Repository
public interface UserRepo extends MongoRepository<User, String> {
// additional methods go here
}
Run Code Online (Sandbox Code Playgroud)
然后你做userRepo.save()find()等来做CRUD操作.
或者你只是MongoTemplate并做CRUD操作.
我的问题是哪个更受欢迎?每种方法的优缺点是什么?谢谢!