标签: spring-data

制作spring-data-mongodb多租户

去年八月sbzoom提出了一个解决方案,使弹簧的数据MongoDB的多租户:

"你必须创建自己的RepositoryFactoryBean.这是Spring Data MongoDB参考文档中的示例.你仍然需要实现自己的MongoTemplate并延迟或删除ensureIndexes()调用.但是你必须重写几个类来确保调用你的MongoTemplate而不是Spring."

有没有人实现这个或类似的东西?

java spring mongodb spring-data spring-data-mongodb

10
推荐指数
1
解决办法
7480
查看次数

如何在mongodb java spring中保存null dbref的对象?

我正在寻找一种解决方案,在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保存对象?

谢谢你的帮助!

java spring mongodb spring-data spring-data-mongodb

10
推荐指数
1
解决办法
6555
查看次数

Spring Data Mongodb存储库不能正确实现继承

有两种类型的实体,它们映射到单个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应该返回SuperclassSubclass对象.它在Spring Data JPA中以这种方式工作.

有没有人遇到过这个bug并且有任何解决方法可以解决它?

java spring spring-data spring-data-mongodb

10
推荐指数
1
解决办法
4376
查看次数

Spring Query:具有可分页的Haversine公式

我正在尝试使用Haversine公式来查找具有PageableSpring 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)

jpa haversine spring-data spring-data-jpa

10
推荐指数
1
解决办法
1812
查看次数

在存储库中保存实体不起作用SPRING

我正在尝试在存储库中保存实体,但它根本不起作用.存储库是自动装配的,在运行时我使用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)

java spring hibernate repository spring-data

10
推荐指数
1
解决办法
2万
查看次数

Spring Data Repository动态查找器Oracle In子句最大值为1000

我想知道是否有一种机制可以将超过1000个项目的集合处理到Spring Repository中以获取SQL IN子句.现在,我们在将项目列表传递到存储库之前拆分项目列表,但是如果驱动程序或弹簧知道Oracle的限制,那将会很好,并且会为我们工作.

java oracle spring spring-data

10
推荐指数
1
解决办法
1069
查看次数

Spring Data:MongoDB 文档中的唯一字段

假设我有以下数据库实体:

@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 应该检查具有此电子邮件地址的用户记录是否已经存在。

问候, 史蒂芬

java spring mongodb spring-data

10
推荐指数
4
解决办法
1万
查看次数

是否有针对JPA,spring-data,spring-data-rest的通用REST查询语言

要求

  • 通用查询语言,可在GET请求中使用以收集REST api中的资源以过滤返回的资源集
  • 通过“标准”查询语言传递并通过HTTP作为请求参数发送的查询-.eg / someresource?query = ......或/ someresource?abc = 2
  • 在服务器上运行时构造的SQL查询
  • 与jpa,spring-data,spring-data-rest紧密集成-代码越少越好。
  • 嵌套资源和属性路径可用于查询
  • 支持复杂的操作数-EQUALS,GREATER_THAN,LESS_THAN,NEGATION,LIKE,AND,OR,或NOT,IN

例如,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实例,这再次要求服务器代码提前知道查询的复杂性。

https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/querydsl/binding/QuerydslBinderCustomizer.html

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 querydsl spring-data spring-data-rest

10
推荐指数
1
解决办法
1608
查看次数

Java spring 数据 mongodb:在 mongodb 中 UUID 作为实体 ID

我正在使用 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 spring mongodb spring-data spring-data-mongodb

10
推荐指数
1
解决办法
9212
查看次数

如何在 Spring Data 中进行 Mongo 聚合查询?

这是我第一次在 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)

java spring mongodb spring-data spring-data-mongodb

10
推荐指数
2
解决办法
2万
查看次数