标签: criteria-api

按相关实体筛选休眠条件

我有一个包含相关实体集合的实体。

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)

java hibernate criteria-api jakarta-ee

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

JPA Criteria API Join

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)

jpa criteria-api

3
推荐指数
1
解决办法
3547
查看次数

单向一对多关系的条件查询

所以,我有以下实体:

@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,这意味着我们有一个单向的一对多关系。我需要寻找一个POSbyposIdsupplierId。即,找到具有指定的供应商,supplierId然后在供应商的 pos 列表中找到具有指定 posId 的 pos。我如何为此编写条件查询?

我尝试使用子查询。我的想法是创建一个子查询可以取所有POS“的小号Supplier与给定的supplierId。然后主查询将在这些POS's 中搜索POS具有给定的 a posId

问题是我无法编写一个查询来获取Suppliers 的 s 列表POS。显然你不能写一个类型的查询 …

hibernate one-to-many criteria-api

3
推荐指数
1
解决办法
9685
查看次数

如何对 Spring Data 中的 case 语句的结果进行排序?

我们有一个由以下查询支持的 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)

java criteria-api jpa-2.0 spring-data spring-data-jpa

3
推荐指数
1
解决办法
7017
查看次数

JPA CRITERIA QUERY按订单加入列

如何通过加入的实体调用订单?我试图通过以下方式实现以下目标:

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)

jpa criteria-api

3
推荐指数
1
解决办法
6604
查看次数

AND/OR 将 WHERE 条件与 Hibernate 中的 Criteria Predicate 进行分组

我在对 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)

hibernate jpa criteria predicate criteria-api

3
推荐指数
1
解决办法
4695
查看次数

无法在 Kotlin 中添加标准 api 谓词,获取 Type interface failed 错误

我遇到了无法解决的非常烦人的问题,我想我错过了一些非常直接的东西,因为我已经有了 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 人知道这个错误的解决方法吗?我见过其他一些人有类似的问题,但我无法根据我看到的答案解决这个问题。

hibernate criteria-api kotlin

3
推荐指数
1
解决办法
778
查看次数

CriteriaBuilder.createQuery 和 EntityManager.createQuery 有什么区别?

假设我有代码,例如:

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()方法以及它们之间有什么区别吗?

java jpa criteria-api

3
推荐指数
1
解决办法
6371
查看次数

Hibernate有条件地subCriteria

我需要转换这个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)

conditional hibernate subquery criteria-api

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

检索JPA中通用实体的主键列定义

假设我有一个使用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意味着任何实体的主键列,或一个实用程序方法来检索它?

hibernate criteria-api jpa-2.0

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