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端点,它提供了一种非常灵活/强大的搜索方式,可以 …
我正在使用 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)
现在,我的搜索页面,其中有formDate和toDate它有与现场相比较DateTime在TranxLog。我尝试使用.withMatcher()但找不到比较日期的方法。
任何的想法?谢谢。
spring hibernate query-by-example hibernate-criteria spring-data-jpa
如何实现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(..)如何避免这种情况?
基本上,我想对存储过程使用"漂亮"的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语句用什么可能是十几个参数?
我试图了解如何使用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符合以下条件的记录的示例:
你不能在关联上使用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还有其他方法吗?
我正在使用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
QueryByExampleExecutor<T>Spring数据JPA中这个接口的方法有哪些用例。我用谷歌搜索,发现的只是官方文档。
也许有人可以通过示例为我指出正确的资源。
特别是findAll(Example<S> example, Pagable pageable),该界面是否是一种更简单的搜索、分页和排序方式?
我是 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 从仅字符串标准创建一个广泛的结果列表,然后编写我自己的逻辑来删除不符合数字标准的对象,但我相信有一种更优雅的方法.
非常感谢您的帮助,也感谢您的放纵!
根据 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 <今天)以及分页和排序。规范是脱离本机查询的唯一方法吗?
query-by-example ×10
spring ×4
spring-data ×4
java ×3
hibernate ×2
c# ×1
criteria-api ×1
dapper ×1
jpa ×1
jpql ×1
matcher ×1
nhibernate ×1
numbers ×1
primitive ×1
querydsl ×1
spring-boot ×1
spring-mvc ×1