我正在尝试根据参考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) 我的文档结构如下:
{
_id: "A",
groups:[{
groupId: "someId",
groupName: "someName",
params: {
type1: ["a", "b"],
type2: ["c", d]
}
}],
config: {
person: {}
dataDetails: {
dataTypeDetails: {},
dataList: ["dt1", "dt2"]
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的Spring Data MongoDB模型类型如下所示:
// Imports etc.
@Document
public class Entity {
@Id
private String _id;
private List<Group> groups;
private Config config;
// setters and getters
public class Group {
private String groupId;
private String groupName;
private ParamData params;
// setter and getters
}
public class ParamData { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Spring-data-rest和spring-data-mongodb来公开只读资源.
我遇到的问题是,我希望对文档有不同的看法.假设我在文档中有一些私人信息,我不想公开公开它们.
所以我尝试了几种方法.我读了这篇文章https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring,描述了如何使用JsonView来选择我们想要公开的字段.
我试过这样的:
@RepositoryRestResource(collectionResourceRel = "recommandation", path = "recommandations")
interface RecommandationRepository extends MongoRepository<Recommendation, ObjectId> {
@Override
@JsonView(View.Public.class)
Iterable<Recommendation> findAll(Iterable<ObjectId> objectIds);
... // other find methods
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.但是在评论中说:https ://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#comment-1725671983答案建议使用@Projections但是@Projections结果在这样的URL中:".../recommandations {?projection}"这意味着投影只是一个选项,因此完整的对象仍然是暴露的.
这里描述了另一种方法https://github.com/spring-projects/spring-data-rest/wiki/Configuring-the-REST-URL-path 它建议对字段使用@RestResource(exported = false)注释我们不想暴露.
但它并不灵活.如果我想公开一个公共只读API和一个私有的完整访问API.每个api不能禁用此注释.
还有其他建议吗?
我正在尝试使用PagingAndSortingRepository带有find MyEntity where field in fieldValues查询的spring ,如下所示:
@Repository
public interface MyEntity extends PagingAndSortingRepository<MyEntity, String> {
List<MyEntity> findByMyField(Set<String> myField);
}
Run Code Online (Sandbox Code Playgroud)
但没有成功.
我希望上面的函数返回其字段与其中一个字段值匹配的所有实体,但它只返回空结果.
即使它看起来像一个非常直接的能力,我在文档中找不到任何引用.
是/如何实现?
谢谢.
java spring spring-data spring-data-mongodb spring-data-commons
我正在使用Spring Data的Querydsl集成来使用谓词执行我的查询.
findAll(predicate, pageable)
Run Code Online (Sandbox Code Playgroud)
有没有办法转储执行的实际原始查询/命令?
我也查看了这个问题的答案,它对我不起作用. 配置MongoDB Java驱动程序的日志记录
- 更新 - 我设法通过在application.properties(而不是log4j.properties)中添加logging.level.org.mongodb.driver = DEBUG来使日志工作正常工作
但是,我仍然无法看到正在执行的原始查询:
2016-03-23 21:50:56 DEBUG查询:56 - 查询完成2016-03-23 21:50:56 DEBUG查询:56 - 在连接上发送命名空间testdb.reservation的查询[connectionId {localValue:4,serverValue: 42631}]到服务器ds046785.mongolab.com:39186
我希望我的可审计(@CreatedDate和@LastModifiedDate)MongoDB文档可以使用ZonedDateTime字段.
显然,Spring Data不支持这种类型(请看一下org.springframework.data.auditing.AnnotationAuditingMetadata).
框架版本:Spring Boot 2.0.0和Spring Data MongoDB 2.0.0
java.lang.IllegalArgumentException: Invalid date type for member <MEMBER NAME>!
Supported types are [org.joda.time.DateTime, org.joda.time.LocalDateTime, java.util.Date, java.lang.Long, long].
Run Code Online (Sandbox Code Playgroud)
@Configuration
@EnableMongoAuditing
public class MongoConfiguration {
}
Run Code Online (Sandbox Code Playgroud)
public abstract class BaseDocument {
@CreatedDate
private ZonedDateTime createdDate;
@LastModifiedDate
private ZonedDateTime lastModifiedDate;
}
Run Code Online (Sandbox Code Playgroud)
我也试过为ZonedDateTime它创建一个自定义转换器,但Spring Data没有考虑它.该类DateConvertingAuditableBeanWrapper有一个ConversionService在构造函数方法中配置的JodaTimeConverters,Jsr310Converters和ThreeTenBackPortConverters.
@Component
public class …Run Code Online (Sandbox Code Playgroud) 我的域名对象 -
Person{
String name;
Date born;
}
Run Code Online (Sandbox Code Playgroud)
我有一个PersonRepository
PersonRepository{
@Query(value="{'born': {$gt: new Date(?0)} }")
findPerson(Date bornAfter);
}
Run Code Online (Sandbox Code Playgroud)
我想抓住在某个约会后出生的所有人.但这不起作用.我错过了什么?mongodb控制台中"born"的日期格式如下
ISODate("2011-11-16T09:46:33.750Z")
Run Code Online (Sandbox Code Playgroud)
我试图在data-jpa源代码中寻找一个单元/集成测试.找不到任何东西.有人能指点我吗?
我对mongodb很新.我正在使用spring-data-mongodb来查询我的java.如果可以实现,请指导我.
假设我有两个对象"Car"和"User"如下,其中car有用户列表,
Class Car {
@Id
String id;
String model;
@DBRef
List<User> users;
@DBRef
Company company;
}
Class User {
@Id
String id;
String name;
}
Run Code Online (Sandbox Code Playgroud)
我想为用户找到所有汽车,(找到所有汽车用户已经给用户的车辆)
是否有可能实现使用spring-data-mongodb?
如果只有一个DBRef元素,这很容易,例如,对于公司我可以写这样的查询,
new Query(Criteria.where("company.$id").is(new ObjectId(companyId)))
Run Code Online (Sandbox Code Playgroud)
但是,如果有一个引用为DBRef的元素列表,如何实现这一点?
感谢帮助.
我在我的java应用程序中使用spring数据mongodb框架来将我的应用程序数据保存在mongodb中.在我的java模型类中,我有两个字段.
1)一个带有@Id注释的字段.2)字段ID
关于映射到保存的mongodb文档中的_id键,哪一个会得到偏好,或者我会得到多个映射的错误.我正在使用spring data mongo 1.6.1.我知道我可以测试一下,但我没有本地环境设置.
我无法诊断我的Java应用程序对MongoDB的请求没有路由到最近的副本的问题,我希望有人可以提供帮助.首先让我解释一下我的配置.
配置:
我正在生产一个Sharded ReplicaSet的MongoDB实例.它目前只是一个单一的碎片(它还没有足够大,还需要拆分).此单个分片由3节点副本集支持.副本集的2个节点位于我们的主数据中心.第三个节点位于我们的辅助数据中心,并且被禁止成为主节点.
我们在两个数据中心同时运行我们的生产应用程序,但是我们的辅助数据中心中的实例以"只读"模式运行,并且从不将数据写入MongoDB.它仅为客户端请求读取现有数据提供服务.此配置的目的是确保如果我们的主数据中心出现故障,我们仍然可以为客户端读取流量提供服务.
我们不希望在我们的辅助数据中心中浪费所有这些硬件,因此即使在愉快的时候,我们也会主动将一部分只读流量负载平衡到在辅助数据中心运行的应用程序实例.此应用程序实例配置为readPreference = NEAREST,并指向在localhost(版本2.6.7)上运行的mongos实例.mongos实例显然配置为指向我们的3节点副本集.
来自mongos:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("52a8932af72e9bf3caad17b5")
}
shards:
{ "_id" : "shard1", "host" : "shard1/failover1.com:27028,primary1.com:27028,primary2.com:27028" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard1" }
{ "_id" : "MyApplicationData", "partitioned" : false, "primary" : "shard1" }
Run Code Online (Sandbox Code Playgroud)
从replicaset的故障转移节点:
shard1:SECONDARY> rs.status() …Run Code Online (Sandbox Code Playgroud)