java - 如何使用条件查询查找具有外键的记录。它是使用 hbm.xml 完成的具有外键的 hibernate 一对一双向映射

标签 java spring hibernate hibernate-criteria hbmxml

我有两个实体,即学生和地址。父实体是学生,子实体是地址。考虑到每个学生只能有一个地址,并且每个地址只能属于一个学生,这使得它成为一对一的双向映射。

我正在尝试根据外键(studentId)检索地址记录。我需要为此编写一个条件查询。由于在一对一双向映射中,我们没有将外键声明为地址实体类中的字段,因此我无法添加限制,否则如果添加限制,则会根据外键查询记录。寻求帮助编写标准查询以根据学生 ID 获取地址记录。

    public class Student{

    private String studentId; //pk
    private String firstName;
    private String lastName;
    private Address address;

   //getters and setters
    }

    public class Address{

    private String addressId; //pk
    private String streetAddress;
    private String addressLine1;
    private String addressLine2;
    private String city;
    private String state;
    private String country;
    private String zipCode;
    private Student student
    //getters and setters
   }



  public interface AddressDao{

   //Find Address based on ForeignKey
   public Address findByStudentId(String studentId)
   }

   public class AddressDaoImpl{

   @Override
    public Address findByStudentId(String studentId) {
    Criteria criteria = createCriteria();
    criteria.add(Restrictions.eq("Should be the column name of the Field holding Foreign key", studentId)); // haven't declared the student ID field in the Address POJO
    Object result = criteria.uniqueResult();
    return result == null ? null : (Address) result;
   }

学生表

  CREATE TABLE STUDENT (
        ID VARCHAR(20) PRIMARY KEY,
        FIRST_NAME VARCHAR(30) NOT NULL,
        LAST_NAME VARCHAR(30) NOT NULL
    );

地址表

    CREATE TABLE ADDRESS (
        A_ID VARCHAR(20) PRIMARY KEY,
        STREET_ADDRESS VARCHAR(20), 
        ADDR1 VARCHAR(20) NOT NULL,
        ADDR2 VARCHAR(20) NOT NULL,
        CITY VARCHAR(20)NOT NULL,
        STATE VARCHAR(20)NOT NULL,
        COUNTRY VARCHAR(20) NOT NULL,
        ZIPCODE INTEGER(5)NOT NULL,
        ID VARCHAR(20) UNIQUE,
        FOREIGN KEY(ID) REFERENCES STUDENT(ID)
    );

学生 hbm.xml

     <hibernate-mapping>
    <class name="Student" table="STDT">
       <id name="studentId" column="ID"</id>
       <property name="name" column="NAME" update="false" type="string" />
       <property name="firstName" column="FIRST_NAME"/>
       <property name="lastName" column="LAST_NAME"/>

       <one-to-one name="address" cascade="all"></one-to-one>
    </class>
<hibernate-mapping>

地址 hbm.xml

  <hibernate-mapping>
    <class name="Address" table="ADDRESS">
       <id name="addressId" column="A_ID"</id>
       <property name="streetAddress" column="STREET_ADDRESS"/>
       <property name="addressLine1" column="ADDR1"/>
       <property name="addressLine2" column="ADDR2"/>
       <property name="city" column="CITY"/>
       <property name="state" column="STATE"/>
       <property name="country" column="COUNTRY"/>
       <property name="zipCode" column="ZIPCODE"/>

       <many-to-one name="student" column="ID" unique="true"
        not-null="true" lazy="false" />
    </class>
<hibernate-mapping>

最佳答案

请参见此处:[ https://stackoverflow.com/a/1787161/333296]

您应该能够通过 student.id 获取学生的地址。

关于java - 如何使用条件查询查找具有外键的记录。它是使用 hbm.xml 完成的具有外键的 hibernate 一对一双向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54639115/

相关文章:

java - Spring,Hibernate with mysql 图像显示不正确

JavaFX TableView 未填充

Java 登录 ASP.NET Web 窗体的方法

java - 使用 Spring Data 和 MongoDB 的单元/集成测试无法模拟存储库

java - 如何在Spring Gradle项目中将Lombok与JPA元模型一起使用?

java - 确保 JPA 使用 setter

java - 几乎平行的线的交点很远

java - 如何将接收到的数据存储在数组中?

java - 从 postman Spring Mvc 获取时未从resttemplate.exchange 获取响应正文

java - 创建类路径资源中定义的名为 'entityManagerFactory' 的 bean