我正在开发多层应用程序解决方案,我的解决方案如下所示
我的Business.Process项目(业务层)只知道Business.DomainObject和Data.Repository项目,因此不知道并且与 Data.Sql.Entity 项目没有关系
我将业务(域)对象发送到存储库并执行在这个项目内部进行映射,然后我在存储库层内使用关系数据层进行 CRUD 过程。
我的传统领域对象是这样的,它只有属性
public class UserBO
{
public string Email { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的业务层类是这样的,
Repository r = new UserRepository();
r.Insert(myUserDomainObject);
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是我的“谓词”查询有一些问题。我的存储库接口中有一个方法
bool IsExists(Expression<Func<BusinessObject,bool>> predicate);
Run Code Online (Sandbox Code Playgroud)
并像这样在我的业务层中使用它;
Repository r = new UserRepository(); <br/>
r.IsExists(p => p.Email.Equals("email address"));
Run Code Online (Sandbox Code Playgroud)
如您所见,它的参数是“业务对象”,但我的实际存储库(与数据库连接)使用我的 dbml 文件内的“数据对象”。
public override bool IsExists(Expression<Func<DataObject, bool>> predicate){
return …Run Code Online (Sandbox Code Playgroud) 我有以下规范,应该检查 a 是否Magazines在a 下File的列表中:MagazinesSubscription
public static Specification<File> getContainingMagazines(final long subscriptionId){
return new Specification<File>() {
@Override
public Predicate toPredicate(Root<File> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Subquery<Subscription> subscriptionSubquery = query.subquery(Subscription.class);
Root<Subscription> subscriptionRoot = subscriptionSubquery.from(Subscription.class);
ListJoin<Subscription, Magazine> subscriptionMagazineJoin = subscriptionRoot.join(Subscription_.magazines);
Path<Long> subscriptionIdPath = subscriptionRoot.get(Subscription_.id);
subscriptionSubquery.
select(subscriptionRoot).
where(cb.equal(subscriptionIdPath, subscriptionId));
ListJoin<File, Magazine> magazinesJoin = root.join(File_.magazines);
return cb.and(magazinesJoin.get(Magazine_.id).in(subscriptionMagazineJoin.get(Magazine_.id)));
}
};
}
Run Code Online (Sandbox Code Playgroud)
在我的服务中,我正在这样做:
public int findFilesWithSubscription(long subscriptionId) {
List<File> fileList = fileRepository.findAll(FileSpecs.getContainingMagazines(subscriptionId));
return fileList.size();
}
Run Code Online (Sandbox Code Playgroud)
涉及的实体如下:
@Entity
@Table(name = "nim_file")
public …Run Code Online (Sandbox Code Playgroud) 在 Java 8 中,该类Comparator有一个非常漂亮的静态方法,它通过使用 a 的结果作为 的输入来将 a 组合Function为 a 。ComparatorFunctionComparator
我想做的是能够将Function对象与其他类型(例如 )组合Predicate,以使我的代码更具可读性,并使我的函数操作更强大。
例如,假设有一个Set<Person>where Personhas apublic String getName()方法。我希望能够过滤掉Person没有名称的对象。理想情况下,语法如下所示:
people.removeIf(Predicates.andThenTest(Person::getName, String::isEmpty));
Run Code Online (Sandbox Code Playgroud)
是否有任何内置方法可以将 aFunction与 a 之类的东西组合起来Predicate?我知道Function#andThen(Function),但这仅对将函数与其他函数组合有用,遗憾的是,Predicate没有extend Function<T, Boolean>。
PS我也知道我可以使用像 lambda 这样的 lambda p -> p.getName().isEmpty(),但我想要一种Predicate用Function.
Clojure 中是否有一种快速方法来检查序列是否恰好有 1 个元素?请注意,序列可能包含 nils。
如果我正确读取源代码,调用count序列需要 O(n) 时间。
替代解决方案:
(and
(not (empty? a-seq))
(empty? (rest a-seq)))
Run Code Online (Sandbox Code Playgroud)
文档说调用empty?集合与coll调用相同(not (seq coll)),但他们没有指定其效率或调用empty?序列时会发生什么。我尝试在 github 存储库中搜索其empty?实现方式,但它忽略了搜索中的问号,并且出现了大量“空”的点击。我想empty?是restO(1),但话又说回来,count不是......
当我尝试使用 Querydsl(如 Spring 参考Spring 1.10.4.RELEASE 参考中所示)时,我从 IDE 中收到一些错误:无法解析方法 findAll(predicate)。我将导入更改为 com.mysema.query.types.Predicate。现在方法看起来不错。但我无法解决问题:
Predicate predicate = user.getUsername().equalsIgnoreCase(username).and((user.getId().equals(userid)).not);
Run Code Online (Sandbox Code Playgroud)
我收到错误:无法解析方法:并且无法解析方法。
一些参考:示例 32. 存储库上的 Querydsl 集成
interface UserRepository extends CrudRepository<User, Long>, QueryDslPredicateExecutor<User> {
}
Run Code Online (Sandbox Code Playgroud)
以上允许使用 Querydsl Predicate 编写类型安全查询。
Predicate predicate = user.firstname.equalsIgnoreCase("dave")
.and(user.lastname.startsWithIgnoreCase("mathews"));
userRepository.findAll(predicate);
Run Code Online (Sandbox Code Playgroud)
但例子是不正确的。有人知道如何使用这个吗?
我必须在 Prolog 中创建家庭关系来完成一项作业,我偶然发现了这个问题。
man(john).
woman(lisa).
married(john,lisa).
?- married(john,X).
X = lisa.
?- married(X,john).
false.
Run Code Online (Sandbox Code Playgroud)
如何使这个谓词以两种方式起作用?如果约翰嫁给了丽莎,那么丽莎也嫁给了约翰。
对于事实,我只能使用性别、父母和已婚:
man(john).
woman(lisa).
parent(john,steve).
parent(lisa,steve).
married(john,lisa).
Run Code Online (Sandbox Code Playgroud)
这个要求使得这个解决方案对我来说无法使用。我不能只添加关系,wife(lisa,john).因为我必须自己定义妻子、丈夫等。
wife(X,Y) :- woman(X),married(X,Y).
Run Code Online (Sandbox Code Playgroud) 我正在尝试为现有的 CoreData 应用程序(简单的日志记录应用程序)构建搜索视图。我把所有存储与CoreData的数据和被提取与@FetchRequest:
@State private var searchPredicate: NSPredicate? = NSPredicate(format: "title contains[c] %@", "")
@FetchRequest( entity: Item.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Item.title, ascending: true)],
predicate: NSPredicate(format: "title contains[c] %@", "h")
)
var items: FetchedResults<Item>
Run Code Online (Sandbox Code Playgroud)
它现在只获取通过谓词测试的项目,在这种情况下,这些项目都是包含“h”的项目。然后我将结果显示在 SearchView 主体的列表中:
List {
ForEach(Items) { Item in
ListViewItem(title: Item.title!, subTitle: Item.subTitle!, createdAt: "\(Item.createdAt!)")
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个新类“Searchbar”,它在搜索视图中被调用,它应该根据搜索字段的输入创建一个谓词,然后将它作为绑定传递给父级,然后基于该谓词正确的项目可以显示。
在搜索视图中调用 VStack 顶部的搜索栏:
SearchBar(text: $searchText, predicate: $searchPredicate)
Run Code Online (Sandbox Code Playgroud)
绑定会根据“searchBar”中的用户输入而变化:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
text = searchText
predicate = NSPredicate(format: "title contains[c] %@", searchText)
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好... …
我有一个 spring boot 应用程序,我们有一个带有一组功能标志的 application.yml
featureFlag:
featureOne:true
featureTwo:true
featureThree:true
featureFour:false
Run Code Online (Sandbox Code Playgroud)
然后这个文件被一个这个类读取
@Configuration
@ConfigurationProperties(prefix="featureFlag")
public class FeatureFlag{
private Boolean featureOne;
private Boolean featureTwo;
private Boolean featureThree;
private Boolean featureFour;
/*The predicates based on the feature flags*/
private Predicate<FeatureFlag> isFeatureFlagOneEnabled = featureFlag.isFeatureOne();
private Predicate<FeatureFlag> isFeatureFlagTwoEnabled = featureFlag.isFeatureTwo();
private Predicate<FeatureFlag> isFeatureFlagThreeEnabled = featureFlag.isFeatureThree();
private Predicate<FeatureFlag> isFeatureFlagFourEnabled = featureFlag.isFeatureFour();
}
Run Code Online (Sandbox Code Playgroud)
我想传递实际的谓词并迭代它们中的每一个,但我想知道我是否可以做一个通用函数,我将传递带有要测试的值的谓词列表,如果所有这些都为真,则该函数返回给我一个真否则假
然后在这个类中添加一些这样的代码,因为我想按需生成这个列表,例如我有一个客户 x 购买了 featureOne 和 featureTwo,在这个例子中我创建了一个这样的列表
Set<Predicate<FeatureFlag>> rulesForClientX = new HashSet<>();
rulesForClientX.add(isFeatureFlagOneEnabled);
rulesForClientX.add(isFeatureFlagTwoEnabled);
Run Code Online (Sandbox Code Playgroud)
然后我想为该客户端创建一个特定的逻辑并将之前创建的谓词列表传递给它,但我想我需要这样的东西
Function<List<Predicate<FeatureFlag>>, Boolean> iteratePredicates = (predicates) -> {
//test each …Run Code Online (Sandbox Code Playgroud) 我正在使用 Criteria API 使用过滤器构建命名查询。它适用于普通的字符串比较,但在过滤 UUID 时会引发以下错误:
org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [67279329-5096-4196-9E73-748B33122CE2] did not match expected type [java.util.UUID (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [67279329-5096-4196-9E73-748B33122CE2] did not match expected type [java.util.UUID (n/a)]
Run Code Online (Sandbox Code Playgroud)
有几个问题解决了这个问题,但都没有奏效,我尝试了以下方法:
@Column(name = "id", updatable = false, nullable = false)到实体字段@Type(type="org.hibernate.type.UUIDCharType")到实体字段@Type(type="uuid-char")到实体字段Foo 实体:
org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [67279329-5096-4196-9E73-748B33122CE2] did not match expected type [java.util.UUID (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [67279329-5096-4196-9E73-748B33122CE2] did not match expected type [java.util.UUID (n/a)]
Run Code Online (Sandbox Code Playgroud)
SQL 变体:
@Entity
//lombok …Run Code Online (Sandbox Code Playgroud) TL; DR:我玩弄范围和相应的一系列的适配器从范围图书馆。范围适配器std::views::take_while和std::views::filter谓词都从输入序列中排除某些元素。为什么take_while采取const谓词而filter没有?
我有一个std::vector<int>并想对其进行迭代,但我想在击中时停止迭代5。通过使用范围适配器,std::views::take_while我可以实现如下:
std::vector<int> v { 8, 2, 5, 6 };
for (int i : v | std::views::take_while([](int i) { return i != 5; })) {
std::cout << "Value: " << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
价值:8
价值:2
但是,我现在也想处理5,因此循环必须进一步运行一个迭代步骤。我没有找到合适的范围适配器,所以我写了以下有状态的 lambda 表达式:
auto cond = [b = true](int i) mutable {
return b ? b …Run Code Online (Sandbox Code Playgroud) predicate ×10
java ×4
java-8 ×2
c# ×1
c++ ×1
c++20 ×1
clojure ×1
core-data ×1
criteria-api ×1
function ×1
hibernate ×1
jpa ×1
lambda ×1
linq ×1
linq-to-sql ×1
performance ×1
prolog ×1
querydsl ×1
search ×1
spring ×1
spring-data ×1
std-ranges ×1
swiftui ×1