java - 如何使用 JPA 2.0 的 CriteriaBuilder 为多对一关系构建动态查询

标签 java hibernate spring criteria jpa-2.0

我坚持使用 JPA 2.0 中的 CriteriaBuilder 构建动态查询。我的应用程序基于 Spring 3.0、Hibernate 3.6.0 + JPA 2.0。实际上我有两个实体,一个是 taUser,另一个是 taContact,在我的 taUser 类中有一个属性,它与taContact 我的 pojo 类是(示例)

public class TaUser implements java.io.Serializable {
    private int userId;
    private TaContact taContact;
    public int getUserId() {
        return this.userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }
    public TaContact getTaContact() {
        return taContact;
    }

    public void setTaContact(TaContact taContact) {
        this.taContact = taContact;
    }

    }


   public class TaContact implements java.io.Serializable {

    private int contactId;

    public int getContactId() {
        return this.contactId;
    }

    public void setContactId(int contactId) {
        this.contactId = contactId;
    }
   private int contactNumber;

    public int getContactNumber() {
        return contactNumber;
    }

    public void setContactNumber(int contactNumber) {
        this.contactNumber = contactNumber;
    }

   }

和我的orm .xml

<entity class="com.common.model.TaUser" name="TaUser">
        <table name="ta_user" />
        <attributes>
            <id name="userId">
                <column name="USER_ID" />
                <generated-value strategy="AUTO" />
            </id>
            <many-to-one name="taContact"
                target-entity="TaContact">
                <join-column name="Contact_id" />
            </many-to-one>
</attributes>
</entity>

我如何创建使用条件构建动态查询实际上这是我的 jpql 查询我想将其更改为使用条件构建动态查询。

String jpql = 
    "select * from Tauser user where user.userId = "1" and user.taContact.contactNumber="8971329902";

如何检查第二个where条件?

user.taContact.contactNumber="8971329902"

Root<T> rootEntity;
        TypedQuery<T> typedQuery = null;
        EntityManagerFactory entityManagerFactory = this.getJpaTemplate()
                .getEntityManagerFactory();
        CriteriaBuilder criteriaBuilder = entityManagerFactory
                .getCriteriaBuilder();
        CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(TaUser.class);
                rootEntity = criteriaQuery.from(TaUser.class);
                criteriaQuery.where(criteriaBuilder.equal(rootEntity.get("userId"),
                "1"));
        criteriaQuery.where(criteriaBuilder.equal(rootEntity.get("taContact.contactNumber"),
        "8971329902")); --- here  i m getting error 
    at 

org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:110)
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:218)
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:189)
    at com.evolvus.core.common.dao.CommonDao.findByCriteria(CommonDao.java:155)

我该如何解决这个问题?

最佳答案

我猜这是这样做的方法:

public TaUser getUserByIdAndContactNumber(
    final long userId,
    final long contactNumber){

    final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    final CriteriaQuery<TaUser> query = cb.createQuery(TaUser.class);
    final Root<TaUser> root = query.from(TaUser.class);
    query
        .where(cb.and(
            cb.equal(root.get("userId"), userId),
            cb.equal(root.get("taContact").get("contactNumber"), contactNumber)
        ));
    return entityManager.createQuery(query).getSingleResult();
}

顺便说一句,8971329902 对于 int 字段来说太大了。将字段类型设置为 long

关于java - 如何使用 JPA 2.0 的 CriteriaBuilder 为多对一关系构建动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4825456/

相关文章:

java - 在 java 类和 android Activity 之间流式传输时音频不清晰

mysql - 创建命名查询!我不知道它是如何创造的

spring - 如何在 Spring Batch Admin UI 中创建和部署 Spring Batch 作业

Tomcat集群中的Spring Websocket

java - 我应该将初始 java String 值从 null 设置为 ""吗?

java - 如何将 TableView 内的 TableColumn 的总和绑定(bind)到外部 Label textProperty()?

java - 将 JVM 和代码合并到一个文件中

spring - org.h2.jdbc.JdbcSQLException : NULL not allowed for column "ID"

mysql - JPA 不允许实体由来自多个表的列组成?

java - 如何在 spring boot 中为应用程序 yml 定义复​​杂列表?