标签: query-by-example

Spring Boot和JPA:使用可选的远程标准实现搜索查询

这是一个SSCCE,显示研究,不是一个骗局,是关于主题!


Spring Boot REST服务和MySQL在这里.我有以下Profile实体:

@Entity
@Table(name = "profiles")
public class Profile extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "profile_given_name")
    private String givenName;

    @Column(name = "profile_surname")
    private String surname;

    @Column(name = "profile_is_male")
    private Integer isMale;

    @Column(name = "profile_height_meters", columnDefinition = "DOUBLE")
    private BigDecimal heightMeters;

    @Column(name = "profile_weight_kilos", columnDefinition = "DOUBLE")
    private BigDecimal weightKilos;

    @Column(name = "profile_dob")
    private Date dob;

    // Getters, setters & ctor down here
}
Run Code Online (Sandbox Code Playgroud)

我也有一个ProfileController,我希望公开一个GET端点,它提供了一种非常灵活/强大的搜索方式,可以 …

jpql query-by-example querydsl spring-data-jpa spring-boot

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

Spring JPA ExampleMatcher 比较日期条件

我正在使用 Spring JPA 并使用 Example Matcher 获取数据列表。源代码如下:

public Page<TranxLog> findAllByConditions(TranxReportFormModel formModel, Pageable page) {
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withNullHandler(ExampleMatcher.NullHandler.IGNORE)
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
                .withIgnoreCase()
                .withIgnoreNullValues();
        Example<TranxLog> example = Example.of(formModel.getTranxLog(), matcher);
        return tranxlogRepository.findAll(example, page);
    }
Run Code Online (Sandbox Code Playgroud)

现在,我的搜索页面,其中有formDatetoDate它有与现场相比较DateTimeTranxLog。我尝试使用.withMatcher()但找不到比较日期的方法。

任何的想法?谢谢。

spring hibernate query-by-example hibernate-criteria spring-data-jpa

9
推荐指数
2
解决办法
6673
查看次数

如何使ExampleMatcher只匹配一个属性?

如何实现ExampleMatcher,从我的类中随机匹配一个属性并忽略其他属性?

假设我的课程是这样的:

Public Class Teacher() {
    String id;
    String name;
    String address;
    String phone;
    int area;
    ..other properties is here...
}
Run Code Online (Sandbox Code Playgroud)

如果我想按名称匹配:

Teacher TeacherExample = new Teacher("Peter");

ExampleMatcher matcher = ExampleMatcher.matchingAny()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
.withIgnoreCase()
.withIgnorePaths("id", "address", "phone","area",...);   //no name 
Run Code Online (Sandbox Code Playgroud)

如果我想按地址匹配:

ExampleMatcher matcher = ExampleMatcher.matchingAny()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
.withIgnoreCase()
.withIgnorePaths("id", "name", "phone","area",...); //no address
Run Code Online (Sandbox Code Playgroud)

所以我需要重复withIgnorePaths(..)如何避免这种情况?

java matcher query-by-example spring-data

8
推荐指数
1
解决办法
8367
查看次数

Dapper是否支持使用存储过程的强类型对象?

基本上,我想对存储过程使用"漂亮"的Dapper语法,而不必手动使用exec MySproc @p1, @p2, @p3, @p4等等,但我需要能够传入一个具有各种属性集的强类型对象,并将此对象用于映射参数.我知道我可以用一个匿名对象来做这个,但我想到的场景就像一个复杂的搜索表单,可以搜索几个字段,相应的存储过程可以有很多参数(很多都有默认值) ).

理想情况下,我希望能够做到这样的事情:

var cust = new Customer();
cust.FirstName = ...
cust.LastName = ...

// using .NET 3.5 so need to use ugly syntax :(
var result = connection.Query<Customer>("MySproc", cust, null, false, null, CommandType.StoredProcedure).Single();
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用并抛出错误,因为我的Customer对象可能有十几个或更多属性,而我在这种情况下只寻找两个; Dapper似乎只是检查每个属性并分配一个值,假设在可能没有的情况下sproc中有相应的参数.

我可以使用PetaPoco(传入一个强类型对象一个匿名对象)做类似的事情,但我正在寻找比PetaPoco更抽象的东西.

我想在Dapper中做什么(或者其他微ORM?我不能使用NHibernate或重量级ORM),或者是否有一种方法我可以忽略得到相同的功能而不必写一个exec语句用什么可能是十几个参数?

stored-procedures query-by-example dapper

7
推荐指数
1
解决办法
3566
查看次数

Spring Data ExampleMatchers by Example

我试图了解如何使用Spring Data的Query by Example功能,并且正在努力了解如何使用ExampleMatcher它及其各种with*方法.使用匹配器的经典示例包括以下代码段:

Person person = new Person();                          
person.setFirstname("Dave");                           

ExampleMatcher matcher = ExampleMatcher.matching()     
  .withIgnorePaths("lastname")                         
  .withIncludeNullValues()                             
  .withStringMatcherEnding();                          

Example<Person> example = Example.of(person, matcher);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我无法将我的大脑包裹在这个DSL上.我们Person来自文档中的示例.假设一个Person实体看起来像这样:

// Pseudo code; omitting JPA annotations for this example
public class Person {
    private String firstName;
    private String lastName;
    private Date dob;
    private Long score;

    // Getters, setters & constructor omitted
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我展示如何构建一个ExampleMatcher允许我找到Person符合以下条件的记录的示例:

  • 名字以" Sme " 开头; 和
  • 姓氏长度不超过10个字符; 和
  • 出生日期是1970-01-01之前; 和
  • 得分在10到20之间,包括在内 …

spring query-by-example spring-data spring-data-jpa

7
推荐指数
1
解决办法
6437
查看次数

关于关联的示例查询

你不能在关联上使用QBE是非常令人沮丧的.

我有一个大型数据表,大约有8对多列.每个列都有一个下拉列表来过滤表.

我们假设如下:

表用户

User { id, UserStatus, UserAuthorization }
Run Code Online (Sandbox Code Playgroud)

我想使用这段代码:

Criteria crit = getSession().createCriteria(class);
crit.add(Example.create(userObject));
Run Code Online (Sandbox Code Playgroud)

这不适用于以下示例userObject:

User id=1 { UserStatus=Active, UserAuthorization=Admin }
Run Code Online (Sandbox Code Playgroud)

因为QBE不支持馆藏.

解决此问题的一种方法是以这种方式使用它:

crit.createCriteria("UserStatus").add(Example.create(userStatusObject));
crit.createCriteria("UserAuthorization").add(Example.create(userAuthorizationObject));
Run Code Online (Sandbox Code Playgroud)

我的问题是如何使用给定的User对象动态编程.除了使用QBE还有其他方法吗?

hibernate query-by-example

6
推荐指数
1
解决办法
1993
查看次数

NHibernate Criteria QueryByExample在中间停留了SQL

我正在使用Criteria来加速查询,而我几乎就在那里.

使用"按示例查询"匹配表中的行,删除具有相同ID的重复行,然后分页.

当然,除非删除重复的行,否则我无法分页,我不知道该怎么做.它可以在SQL中完成,但是它确实适用于流畅的代码,ISQLQuery不会返回ICriteria对象.

    public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize)
    {
        var startRow = startingPage * pageSize;

        // Query By Example.
        var example = Example.Create(exampleEntitySearch)
            .IgnoreCase()
            .EnableLike(MatchMode.Anywhere)
            .ExcludeZeroes();

        var results = this.Session.CreateCriteria(typeof(EntitySearch))
                                .Add(example)
        // select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1
                                .SetFirstResult(startRow)
                                .SetMaxResults(pageSize)
                                .List<DealSearch>();

        return results;
    }
Run Code Online (Sandbox Code Playgroud)

我读过的建议是在NHibernate中编写SQL查询,但我想不出如何在分区SQL上转换漂亮的"ROW_NUMBER()".我想让它首先工作到底,然后让它更优雅.

我希望将这个峰值投入生产并证明~90%加速.

c# nhibernate fluent-nhibernate query-by-example criteria-api

5
推荐指数
1
解决办法
616
查看次数

Spring数据JPA中QueryByExampleExecutor&lt;T&gt;接口的方法用例

QueryByExampleExecutor<T>Spring数据JPA中这个接口的方法有哪些用例。我用谷歌搜索,发现的只是官方文档。

也许有人可以通过示例为我指出正确的资源。

特别是findAll(Example<S> example, Pagable pageable),该界面是否是一种更简单的搜索、分页和排序方式?

java spring query-by-example spring-data spring-data-jpa

5
推荐指数
2
解决办法
7593
查看次数

使用 Spring ExampleMatcher 处理数字

我是 Java 和 Spring 的新手,我正在使用 Spring JPA 构建系统。我现在正在处理我的服务和控制器类,我想创建一个动态查询。我创建了一个表单,用户可以在其中在字段中输入值,或将它们留空。然后我使用示例匹配器创建一个基于非空字段和数据库中匹配对象的非空字段的查询对象的示例。

它与字符串一起工作正常,并且可以与数字一起工作,以防用户输入的数字与数据库中的数字匹配。我想问社区的是:我们如何使用 Spring ExampleMatcher 添加逻辑,以便与数字相关的查询不是 Select * from Projects where project.return = 10 而是例如 Select * from Projects where project.return >=10?

这是一个非常基本的问题,但我在网上到处找,都找不到答案。我发现的所有消息来源都说 ExampleMatcher 只处理字符串,但我觉得奇怪的是,如此强大的系统没有处理高于/低于数字类型标准的逻辑。

我的示例匹配器代码:

    ExampleMatcher matcher = ExampleMatcher.matching()
            .withIgnoreNullValues()
            .withIgnoreCase()
            .withIgnorePaths("projectId", "businessPlans", "projectReturn", "projectAddress.addressId")
Run Code Online (Sandbox Code Playgroud)

我想添加如下内容:

.withMatcher("projectAmountRaised", IsMoreThan(Long.parseLong()));
Run Code Online (Sandbox Code Playgroud)

我本来想拥有的,但它已被弃用:

public static List getStockDailyRecordCriteria(Date startDate,Date endDate,
        Long volume,Session session){

Criteria criteria = session.createCriteria(StockDailyRecord.class);
if(startDate!=null){
        criteria.add(Expression.ge("date",startDate));
}
if(endDate!=null){
        criteria.add(Expression.le("date",endDate));
}
if(volume!=null){
        criteria.add(Expression.ge("volume",volume));
}
criteria.addOrder(Order.asc("date"));

return criteria.list();
  }
Run Code Online (Sandbox Code Playgroud)

因此,我正在寻找类似的东西......我可以使用 ExampleMatcher 从仅字符串标准创建一个广泛的结果列表,然后编写我自己的逻辑来删除不符合数字标准的对象,但我相信有一种更优雅的方法.

非常感谢您的帮助,也感谢您的放纵!

primitive jpa numbers spring-mvc query-by-example

5
推荐指数
1
解决办法
979
查看次数

按示例查询 Spring 数据 - 在条款中?

根据 Spring Docs,我只能为 QBE 编写精确匹配。我只需要精确匹配,但需要一组值(查询的 IN 子句)。

例如

Person p = new Person();
p.setId(); // need to match among set of ids.
Example.of(p);
Run Code Online (Sandbox Code Playgroud)

这是否可以通过 QBE 实现,还是我完全走错了路?

就像是 :

Page<S> findByIdIn(List<Integer> ids, Example<S> e, Pageable p)
Run Code Online (Sandbox Code Playgroud)

两全其美?

我真正需要的是,基于多个字段的动态查询(在可能的组合中,比如 id in (1,2,4)、status=open、appointmentDate <今天)以及分页和排序。规范是脱离本机查询的唯一方法吗?

java spring query-by-example spring-data spring-data-jpa

5
推荐指数
1
解决办法
2335
查看次数