在后去年八月sbzoom提出了一个解决方案,使弹簧的数据MongoDB的多租户:
"你必须创建自己的RepositoryFactoryBean.这是Spring Data MongoDB参考文档中的示例.你仍然需要实现自己的MongoTemplate并延迟或删除ensureIndexes()调用.但是你必须重写几个类来确保调用你的MongoTemplate而不是Spring."
有没有人实现这个或类似的东西?
我正在寻找一种解决方案,在mongodb java spring框架中使用null dbref保存对象.请考虑以下示例:
@Document
public class A {
@Id
private String id;
@DBRef
private B b;
public A() {
this.b = null;
}
...
}
@Document
public class B {
@Id
private String id;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我实例化A,即A a = new A();通过存储库将此对象保存到mongodb,即aRepo.save(a).然后,我有以下例外:
org.springframework.data.mapping.model.MappingException: Cannot create a reference to an object with a NULL id.
Run Code Online (Sandbox Code Playgroud)
有没有办法用null dbref保存对象?
谢谢你的帮助!
有两种类型的实体,它们映射到单个MongoDB集合中的两个Java类:
@Document
public class Superclass { ... }
@Document(collection = "superclass")
public class Subclass extends Superclass { ... }
Run Code Online (Sandbox Code Playgroud)
和这些实体的两个存储库:
public interface SuperclassRepository extends MongoRepository<Superclass, String> {}
public interface SubclassRepository extends MongoRepository<Subclass, String> {}
Run Code Online (Sandbox Code Playgroud)
MongoRepositories不要正确处理实体的继承.在查询所有Subclass对象(例如SubclassRepository.findAll())时,结果集包含Superclass对象,这些对象是实例化的(或者至少已经尝试实例化),对于属于Subclass但不属于的一部分的字段具有空值Superclass.
预期的结果是SubclassRepository应该只返回Subclass对象,而SuperclassRepository应该返回Superclass和Subclass对象.它在Spring Data JPA中以这种方式工作.
有没有人遇到过这个bug并且有任何解决方法可以解决它?
我正在尝试使用Haversine公式来查找具有Pageable的Spring Data JPA Query中某个位置附近的实体,但我没有完成它.
我的第一种方法看起来像这样
@Query("SELECT m, (6371 * acos(cos(radians(:latitude)) * cos(radians(m.latitude)) * cos(radians(m.longitude) - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(m.latitude)))) as dist FROM Entity m WHERE dist < :distance ORDER BY dist DESC")
public List<Entity> findEntitiesByLocation(@Param("latitude") final double latitude, @Param("longitude") final double longitude, @Param("distance") final double distance, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)
但它失败了,因为Spring/JPA似乎无法在where子句中使用别名.stacktrace中的SQL看起来像这样
select (...),(haversine) as col_1_0_ where dist<? order by col_1_0_ DESC
Run Code Online (Sandbox Code Playgroud)
所以where子句中的别名不会被替换.使用"col_1_0_"(不使用")代替dist也不起作用.
根据这个SO答案,至少MySQL是由内部解释的,并且在Where子句中使用别名是不可能的.建议的解决方案是使用HAVING而不是WHERE,但在HAVING子句中,别名不会被解析.
我知道我可以将Haversine公式移动到where子句中,但我仍然需要在Order By子句中使用它,我认为它可能会在Order By子句中使用相同的长Haversine公式来降低性能,因为我选择了几百个数千个实体.
然后我尝试手动创建查询,但我不知道如何将Pageable应用于此:
@Override
public List<Entity> findEntitiesByLocation(final double latitude, …Run Code Online (Sandbox Code Playgroud) 我正在尝试在存储库中保存实体,但它根本不起作用.存储库是自动装配的,在运行时我使用saveAndFlush来保存实体.我正在使用PostgreSQL.在上面的测试方法中,我添加了评论并解释了发生了什么.我期望saveAndFlush方法可以工作,但它没有.我找不到原因.
@Transactional
public class TestClass{
@Autowired private MyRepository repository;
@Autowired private EntityManager entityManager;
// Working version
public void writingToRepositoryWorking() {
entityManager.getTransaction().begin();
entityManager.persist(new MyData(99));
entityManager.getTransaction().commit();
}
// not working and throws exception :
// TransactionRequiredException: no transaction is in progress
public void writingToRepositoryNotWorking() {
repository.saveAndFlush(new MyData(99));
}
// not working, no exception, no data in repository,
// but auto generated ID is incremented
public void writingToRepositoryNotWorkingToo() {
repository.save(new MyData(99));
}
}
Run Code Online (Sandbox Code Playgroud)
存储库接口文件
@Repository
@Transactional
public interface MyRepository extends JpaRepository<MyData, Long> {} …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种机制可以将超过1000个项目的集合处理到Spring Repository中以获取SQL IN子句.现在,我们在将项目列表传递到存储库之前拆分项目列表,但是如果驱动程序或弹簧知道Oracle的限制,那将会很好,并且会为我们工作.
假设我有以下数据库实体:
@Document(collection = "users")
public class User {
@Id
private String id;
private String firstname;
private String lastname;
private String email;
}
Run Code Online (Sandbox Code Playgroud)
如何强制字段电子邮件是唯一的?这意味着当应用程序尝试保存实体时,MongoDB 应该检查具有此电子邮件地址的用户记录是否已经存在。
问候, 史蒂芬
要求
例如,resourceA.attribute1 =“ CAT” AND resourceA.subResourceB.attribute2> = 42 AND resourceA.attribute3 IN(“ WHIZ”,“ BANG”)
我研究了四种解决方案-每种解决方案都更加接近目标。有没有我找不到的其他解决方案,还是没有这样的完整解决方案-是在下面概述的“基于RSQL的REST查询语言”基础上的答案吗?
1)春季数据剩余查询
Spring数据中有很多支持,可用于在代码中开发复杂的查询,但这要求开发人员事先了解查询的结构,并相应地构造代码。 https://docs.spring.io/spring-data/rest/docs/current/reference/html/#repository-resources.query-method-resource
2)spring-data,spring-data-rest,query-dsl
http://www.baeldung.com/rest-api-search-querydsl-web-in-spring-data-jpa
+ ve非常适合-完全可用的解决方案,开箱即用几乎为零
可以构建+ ve深度嵌套的查询,并且服务器可以动态生成正确的SQL。
-ve唯一的运算符是EQUALS'=',以便应用其他运算符,您需要实现QuerydslBinderCustomizer实例,这再次要求服务器代码提前知道查询的复杂性。
3)Baeldung-“建立休息查询语言”
http://www.baeldung.com/spring-rest-api-query-search-language-tutorial
+ ve-接近通用查询语言
-ve-感觉像是演示/ POC
4)使用RSQL的REST查询语言
http://www.baeldung.com/rest-api-search-language-rsql-fiql
+ ve-感觉更完整的查询语言和相关的解析器
-ve-不确定弹簧集成
我正在使用 spring-boot-starter-data-mongodb 构建 spring boot 应用程序:
我有一个看起来像的实体:
@Document(collection = "nodes")
@Data
@Builder
public class Node {
@Id
UUID id;
String info;
}
Run Code Online (Sandbox Code Playgroud)
和存储库界面:
public interface NodesRepository extends MongoRepository<Node, UUID> {
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我插入带有空id字段的Node 对象时,应用程序抛出异常并显示以下消息:
无法为 model.Node 类型的实体自动生成 java.util.UUID 类型的 id!
我知道开箱即用的 spring mongodb 支持用于自动生成的 String 和 BigInteger id 类型。
所以我想知道是否可以使用 UUID 作为我的 id 字段的类型?我可以MappingMongoConverter为我的实体创建某种类型的自定义吗?
这是我第一次在 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) spring-data ×10
spring ×9
java ×8
mongodb ×5
haversine ×1
hibernate ×1
jpa ×1
oracle ×1
querydsl ×1
repository ×1