我有一个包含相关实体集合的实体。
public class Student{
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "COURSE_STUDENT_ID" , insertable=false,updatable=false)
private Set <Course> courses;
Run Code Online (Sandbox Code Playgroud)
我想按课程名称和学生班级 ID 过滤学生。现在我已经弄清楚了如何按类 id 过滤,但我不知道如何按 courseId 过滤,因为 Student 实体有一组课程并且表是相关的。我已经阅读了一些文章,但没有任何代码与我已经读过的代码相匹配。
CriteriaBuilder criteriaBuilder = persistenceStore.createCriteriaBuilder();
CriteriaQuery<Object> criteria = criteriaBuilder.createQuery();
Root<Student> root = criteria.from(Student.class);
List<Predicate> params = new ArrayList<Predicate>();
params.add(criteriaBuilder.equal(root.get("classId"),classId));
Predicate[] predicates = new Predicate[params.size()];
params.toArray(predicates);
criteria.select(root);
criteria.where(criteriaBuilder.and(predicates));
Query query = persistenceStore.createQuery(criteria);
List<Student> resultList = query.getResultList();
Run Code Online (Sandbox Code Playgroud) How would I translate this JPQL query into Criteria API?
select count(p) from Person p join p.glanceList g where p.duration < 1000 and g
.duration < 1000
Run Code Online (Sandbox Code Playgroud) 所以,我有以下实体:
@Entity
public class Supplier {
@Column(name = "SUPPLIERID")
private BigInteger supplierId;
@OneToMany
@JoinColumn(name = "ID_SUPP", foreignKey = @ForeignKey(name = "fk_POIS_SUPP"))
private List<POS> posList;
...
}
@Entity
public class POS {
@Column(name = "POSID")
private BigInteger posId
}
Run Code Online (Sandbox Code Playgroud)
所以,POS没有对 的引用Supplier,这意味着我们有一个单向的一对多关系。我需要寻找一个POSbyposId和supplierId。即,找到具有指定的供应商,supplierId然后在供应商的 pos 列表中找到具有指定 posId 的 pos。我如何为此编写条件查询?
我尝试使用子查询。我的想法是创建一个子查询可以取所有POS“的小号Supplier与给定的supplierId。然后主查询将在这些POS's 中搜索POS具有给定的 a posId。
问题是我无法编写一个查询来获取Suppliers 的 s 列表POS。显然你不能写一个类型的查询 …
我们有一个由以下查询支持的 UI 可排序表,单击某列会order by对该列进行升序或降序排序。问题是其中一列根据条件呈现用户角色名称或其人名,并且我们需要能够对该列进行排序。
目前这是存储库定义
Page<UserActivityLog> findByActivityTargetUserId( Long id, Pageable pageable );
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个看起来或多或少像这样的规范。
private static class UserSpecification implements Specification<UserActivityLog> {
@Override
public Predicate toPredicate(
final Root<UserRelatedEntity> root,
final CriteriaQuery<?> query,
final CriteriaBuilder cb )
cb.selectCase()
.when( root.<Boolean>get( "user.setting.fieldBoolean" ),
root.<RoleType>get( "user.role.roleTypeEnum" ).toString() )
.otherwise( root.<String>get("user.humanNameString") )
... //magic
Run Code Online (Sandbox Code Playgroud)
这显然是不完整的。我不确定如何接受这个(假设它适合我想做的 case 语句)并使其返回Predicate. 我什至可能无法使用Specification添加 case 语句,尽管我怀疑我可以。我也不确定一旦我让它工作,我将如何将“字段名称”传递给Sort(我知道如何传递字段名称,我想我只是不确定如何弄清楚该字段是什么)名称将是)。
值得一提的是,我还不太了解CriteriaBuilderapi。
更新我从Oracle 教程中获取的经过稍微修改的 case 语句示例,该示例演示了我需要做什么,但我不需要返回对象中的 case-ed 列的结果。
SQL> select job, ename
2 , case …Run Code Online (Sandbox Code Playgroud) 如何通过加入的实体调用订单?我试图通过以下方式实现以下目标:
select*from person p inner join telephone t on p.id = t.person_id join s s on s.id = t.sim_id order by s.name DESC
@Entity
public class Person implements Serializable{
@Id
private Long id;
@OneToMany(orphanRemoval = true, mappedBy = "person", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private List<Telephone> telephonesNumber;
@Entity
public class Telephone implements Serializable {
@Id
private String number;
@Id
@ManyToOne()
@JoinColumn(name = "person_id")
private Person person;
@Id
@ManyToOne(cascade = {})
@JoinColumn(name = "sim_id")
private Sim sim;
@Entity
public class …Run Code Online (Sandbox Code Playgroud) 我在对 WHERE 条件进行分组时遇到问题。最终,我的目标是拥有多组 AND 条件,每个条件都是一个 OR。例如:
SELECT *
WHERE ( foo = 1 AND bar = 2)
OR (foo = 3 AND bar = 4)
OR (foo = 5 AND bar = 6)
Run Code Online (Sandbox Code Playgroud)
下面是我用来完成此任务的代码。正如您所看到的,我正在创建 2 个“相等”谓词,然后创建一个嵌套它们的谓词。
List<Waybill> getWaybillsByCriteriaOrderItemList(List< OrderItem > orderItems ) {
CriteriaBuilder cb = em.getCriteriaBuilder()
CriteriaQuery<Waybill> q = cb.createQuery( Waybill )
Root<Waybill> waybillRoot = q.from(Waybill)
q.select( waybillRoot )
List<Predicate> predicates = []
orderItems.each { OrderItem item ->
Predicate carInit = cb.equal( cb.trim(waybillRoot.get('carInit')), item.carInit)
Predicate carNumb = cb.equal( cb.trim(waybillRoot.get('carNumb')), …Run Code Online (Sandbox Code Playgroud) 我遇到了无法解决的非常烦人的问题,我想我错过了一些非常直接的东西,因为我已经有了 Java 中的工作代码。
基本上我所拥有的是这样的:
class ConfigurationSpecification(
private var list: MutableList<SearchCriteria> = mutableListOf()
) : Specification<Configuration> {
override fun toPredicate(root: Root<Configuration>, query: CriteriaQuery<*>, builder: CriteriaBuilder): Predicate? {
val predicates: MutableList<Predicate> = mutableListOf()
for (criteria in list) {
if (criteria.operation == "EQUALS") {
predicates.add(builder.equal(root.get(criteria.key), criteria.value)) <- NOT WORKING root.get(criteria.key) this is making issue
}
}
return builder.and(predicates[0])
}
}
Run Code Online (Sandbox Code Playgroud)
代码真的很简单,但由于某种原因 Kotlin 抱怨它,我得到的错误是这样的:
错误:(19, 51) Kotlin:类型推断失败:没有足够的信息来推断 fun get(p0: String!): 中的参数 Y:路径!请明确指定。
这是工作的java代码:
predicates.add(builder.equal(root.get(criteria.getKey()), criteria.getValue())); <- working with Java
Run Code Online (Sandbox Code Playgroud)
任何有经验的 Kotlin 人知道这个错误的解决方法吗?我见过其他一些人有类似的问题,但我无法根据我看到的答案解决这个问题。
假设我有代码,例如:
EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.select(pet);
TypedQuery<Pet> q = em.createQuery(cq);
List<Pet> allPets = q.getResultList();
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下为什么我们使用两种createQuery()方法以及它们之间有什么区别吗?
我需要转换这个HQL:
FROM Appointment a WHERE (a.group==null OR :user MEMBER OF a.group.groupMembers)
Run Code Online (Sandbox Code Playgroud)
标准.我怎么能认为子标准仅在主标准不匹配时使用?
我尝试了类似的东西,但我被困住了:
Criteria subcrit = crit.createCriteria("group");
subcrit.createAlias("groupMembers", "gmembers");
crit.add(Restrictions.or(Restrictions.eq("group", null), Restrictions.eq("gmembers.snuserId", user.getId())));
Run Code Online (Sandbox Code Playgroud) 假设我有一个使用JPA列出实体的通用方法
public <T> List<T> list(Class<T> entity) throws Exception {
List<T> result = new ArrayList<T>();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<T> query = builder.createQuery( entity );
Root<T> root = query.from( entity );
query.select( root );
//possible?
query.orderBy(builder.asc(...));
result = em.createQuery( query ).getResultList();
return result;
}
Run Code Online (Sandbox Code Playgroud)
无论如何我们要添加orderby到查询并通过主键进行排序而不指定主列作为表达式?我的意思是,有一个Key/ Constant或东西在JPA意味着任何实体的主键列,或一个实用程序方法来检索它?
criteria-api ×10
hibernate ×6
jpa ×4
java ×3
jpa-2.0 ×2
conditional ×1
criteria ×1
jakarta-ee ×1
kotlin ×1
one-to-many ×1
predicate ×1
spring-data ×1
subquery ×1