标签: spring-data

在Spring Repository接口中使用sort()和limit()进行查询

我是使用MongoDB的Spring Data的新手,我希望在MongoRepository扩展接口中有一个自动生成的查询方法,需要过滤,排序和限制.

查询如下所示:

// 'created' is the field I need to sort against

find({state:'ACTIVE'}).sort({created:-1}).limit(1)
Run Code Online (Sandbox Code Playgroud)

存储库界面如下所示:

public interface JobRepository extends MongoRepository<Job, String> {
    @Query("{ state: 'ACTIVE', userId: ?0 }")
    List<Job> findActiveByUserId(String userId);

    // The next line is the problem, it wont work since
    // it's not in the format @Query expects
    @Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)")
    Job findOneActiveOldest();

    ...
}
Run Code Online (Sandbox Code Playgroud)

我知道可以将一个Sort参数添加到查询方法中以便进行排序,但问题是将结果限制为仅一个对象.这可以在不必编写自定义JobRepositoryImpl的情况下完成吗?

谢谢

编辑:

我正在寻找的例子:

@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }")
Job findOneActiveOldest();
Run Code Online (Sandbox Code Playgroud)

要么

@Query("{ state:'ACTIVE' }")
@Sort("{ created:-1 }")
@Limit(1)
Job findOneActiveOldest();
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用:(

mongodb-java spring-data

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

spring-data-mongo - 可选的查询参数?

我使用spring-data mongo和基于JSON的查询方法,并且不确定如何在搜索查询中允许可选参数.

例如 - 说我有以下功能

@Query("{ 'name' : {$regex : ?0, $options : 'i'}, 'createdDate' : {$gte : ?1, $lt : ?2 }} }")
List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange);
Run Code Online (Sandbox Code Playgroud)

- 但我不想应用名称正则表达式匹配,或者如果将NULL值传递给方法,则不应用日期范围限制.

目前,我可能不得不使用mongoTemplate构建查询.

有没有其他选择 - 或者使用mongoTemplate是最佳选择?

谢谢

java spring mongodb spring-data

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

如何在spring数据mongoDB中指定数据库名称

我正在使用Mongo存储库来执行CRUD操作,如下面的代码所示.尽管此代码有效,但文档和集合是在与我想要的DB不同的DB中创建的.如何显式指定要存储文档的数据库名称.

POJO课程:

@Document(collection = "actors")
public class Actor 
{
  @Id
  private String id;
  ...
  //constructor
  //setters & getters
}
Run Code Online (Sandbox Code Playgroud)

存储库:

public interface ActorRepository extends MongoRepository<Actor, String> 
{
  public Actor findByFNameAndLName(String fName, String lName);
  public Actor findByFName (String fName);
  public Actor findByLName(String lName);
}
Run Code Online (Sandbox Code Playgroud)

使用存储库的服务:

@Service
public class ActorService 
{
  @Autowired
  private ActorRepository actorRepository;

  public Actor insert(Actor a)
  {
    a.setId(null);
    return actorRepository.save(a);
  }
} 
Run Code Online (Sandbox Code Playgroud)

我从REST控制器类访问该服务:

@RestController
public class Controllers 
{

  private static final Logger logger = Logger.getLogger(Controllers.class);
  private static final ApplicationContext …
Run Code Online (Sandbox Code Playgroud)

java spring mongodb spring-data

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

Spring Data JPA + JpaSpecificationExecutor + EntityGraph

(使用Spring数据JPA)我有两个实体ParentChild他们之间的一对多/多对一双向关系.我@NamedEntityGraph像这样添加一个父实体:

@Entity
@NamedEntityGraph(name = "Parent.Offspring", attributeNodes = @NamedAttributeNodes("children"))
public class Parent{
//blah blah blah

@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Set<Child> children;

//blah blah blah
}
Run Code Online (Sandbox Code Playgroud)

请注意,Parent的子项的获取类型是LAZY.这是故意的.当我查询个别父母时,我并不总是急于加载孩子.通常我可以使用我的命名实体图来按需加载孩子,可以这么说.但.....

有一种特殊的情况,我想查询一个或多个父母,并急切地加载他们的孩子.除此之外,我还需要能够以编程方式构建此查询.Spring Data提供了JpaSpecificationExecutor,它允许我们构建动态查询,但我无法弄清楚如何将它与实体图一起用于在这种特定情况下急切加载子项.这甚至可能吗?有没有其他方法可以使用规范急切加载到许多实体?

java spring jpa spring-data spring-data-jpa

17
推荐指数
4
解决办法
7389
查看次数

我应该使用Java 8默认方法手动实现Spring Data存储库方法吗?

当使用新的Spring Data Evans版本时,能够使用java 8附带的一些好东西是很好的.其中一个是接口中的默认实现.下面的存储库使用QueryDSL使查询类型安全.

我的问题是,在我写这篇文章之前,我使用了单独的UserRepositoryCustom接口模式,findByLogin然后是另一个类UserRepositoryImpl,在那个类中,我将@PersistenceContext获得当前的EntityManager.

我什么EntityManager时候没有上课?它甚至可能吗?

@Repository
public interface UserRepository extends JpaRepository<User, UUID> {

    final QUser qUser = QUser.user;

    // How do I get the entityManager since this is a interface, i cannot have any variables?
    //@PersistenceContext
    //EntityManager entityManager;

    public default Optional<User> findByLogin(String login) {
        JPAQuery query = new JPAQuery(entityManager);
        User user = query
                .from(qUser)
                .where(
                        qUser.deleter.isNull(),
                        qUser.locked.isFalse(),
                        qUser.login.equalsIgnoreCase(login)
                )
                .singleResult(qUser);

        return Optional.ofNullable(user);
    }
}
Run Code Online (Sandbox Code Playgroud)

java spring spring-data spring-data-jpa

17
推荐指数
1
解决办法
9558
查看次数

如何在使用Spring时注入多个JPA EntityManager(持久性单元)

我需要使用一个数据库进行查询(非修改),一个用于命令(修改).我使用的是Spring Data JPA,所以我有两个配置类:

@Configuration
@EnableJpaRepositories(value = "com.company.read",
        entityManagerFactoryRef = "readingEntityManagerFactory",
        transactionManagerRef = "readingTransactionManager")
@EnableTransactionManagement
public class SpringDataJpaReadingConfiguration {

    @Bean(name = "readingEntityManagerFactory")
    public EntityManagerFactory readingEntityManagerFactory() {
        return Persistence.createEntityManagerFactory("persistence.reading");
    }

    @Bean(name = "readingExceptionTranslator")
    public HibernateExceptionTranslator readingHibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }

    @Bean(name = "readingTransactionManager")
    public JpaTransactionManager readingTransactionManager() {
        return new JpaTransactionManager();
    }

}

@Configuration
@EnableJpaRepositories(value = "com.company.write",
        entityManagerFactoryRef = "writingEntityManagerFactory",
        transactionManagerRef = "writingTransactionManager")
@EnableTransactionManagement
public class SpringDataJpaWritingConfiguration {

    @Bean(name = "writingEntityManagerFactory")
    public EntityManagerFactory writingEntityManagerFactory() {
        return Persistence.createEntityManagerFactory("persistence.writing");
    }

    @Bean(name = "writingExceptionTranslator")
    public …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa spring-data

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

用mongoTemplate分页

我有一个可查询的查询:

Query query = new Query().with(new PageRequests(page, size))
Run Code Online (Sandbox Code Playgroud)

如何使用MongoTemplate执行它?我没有看到一个方法返回Page<T>.

java spring-data spring-data-mongodb

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

如何只返回Spring Data MongoDB中查询的特定字段?

我们如何在Spring Data Mongo中选择特定字段.我尝试以下,但我从投例外FooString.

运用 @Query

@Query(value="{path : ?0}", fields="{path : 0}")
String findPathByPath(String path);
Run Code Online (Sandbox Code Playgroud)

@Query

String findPathByPath(String path);
Run Code Online (Sandbox Code Playgroud)

这是文档模型

@Document(collection = "foo")
public class Foo  {

  String name, path;
  …
}
Run Code Online (Sandbox Code Playgroud)

java spring mongodb spring-data spring-data-mongodb

17
推荐指数
4
解决办法
3万
查看次数

Spring Data - 存储库方法名称中的OR条件

在我的Spring Data项目中,我有一个以下实体:

@Entity
@NamedEntityGraph(name = "graph.CardPair", attributeNodes = {})
@Table(name = "card_pairs")
public class CardPair extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 7571004010972840728L;

    @Id
    @SequenceGenerator(name = "card_pairs_id_seq", sequenceName = "card_pairs_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "card_pairs_id_seq")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "card1_id")
    private Card card1;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "card2_id")
    private Card card2;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "selected_card_id")
    private Card selectedCard;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private …
Run Code Online (Sandbox Code Playgroud)

java spring jpa spring-data spring-data-jpa

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

LiquiBase 问题,类路径资源 [db/changelog/db.changelog-master.yaml] 无法解析为 URL,因为它不存在

我在将 liquibase 与 springboot 集成时遇到问题。我在 pom 文件中添加了 liquibase 依赖项,如下所示:

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>
Run Code Online (Sandbox Code Playgroud)

在 src/main/resources 中,我创建了文件夹 db/changelog。在 db 文件夹中,它位于 liquibase-change.xml 文件,其内容如下:

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <include file="changelog/01-create-employee-scheme.xml" relativeToChangelogFile="true"/>
    <include file="changelog/02-data-insert-employees.xml" relativeToChangelogFile="true"/>

</databaseChangeLog>
Run Code Online (Sandbox Code Playgroud)

在文件夹更改日志中找到文件:

  • 01-create-employee-scheme.xml
<changeSet id="01" author="xy">

    <createTable tableName="employee">
        <column name="id" type="int">
            <constraints nullable="false" primaryKey="true"/>
        </column>
        <column name="firstname" type="varchar(25)">
            <constraints nullable="false"/>
        </column>
        <column name="lastname" type="varchar(25)">
            <constraints nullable="false"/>
        </column>
    </createTable>

</changeSet>
Run Code Online (Sandbox Code Playgroud)
  • 02-data-insert-employees.xml
<insert tableName="employee">
    <column name="id" valueNumeric="1"/>
    <column name="firstname" …
Run Code Online (Sandbox Code Playgroud)

java liquibase spring-data spring-boot

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