有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否在HQL查询中使用getter/setter?

我想直接使用带有HQLsql语句的包装getter/setter来使用@Embedded字段

但它不起作用:

 org.hibernate.QueryException: could not resolve property: address.zip of: Customer [SELECT c FROM Customer c WHERE c.address.zip :=zip]

以下是可能的吗

@Embeddable
pulic class ZipCode {
    String country;
    String zip;
}
@Embeddable
public class Address {
    String street;
    String town;

    @Embedded
    ZipCode zipCode;

    public String getZip() {
        return zipCode().getZip();
    }

    public void setZip(String zip) {
        zipCode.setZip(zip);
    }
}

@Entity
public class Customer {
    @Embedded
    Address address;
}

String FIND_BY_ZIP = "SELECT c FROM Customer c WHERE c.address.zip :=zip";

共 (1) 个答案

  1. # 1 楼答案

    您可以将访问类型更改为AccessType.PROPERTY

    @Embeddable
    public class Address {
        String street;
        String town;
    
        @Embedded
        @Access(AccessType.PROPERTY)
        ZipCode zipCode;
    
        public String getZipCode() {
            return zipCode().getZip();
        }
    
        public void setZipCode(String zip) {
            zipCode.setZip(zip);
        }
    }
    

    这样就有可能做到

    String FIND_BY_ZIP = "SELECT c FROM Customer c WHERE c.address.zipCode :=zip";
    

    默认情况下,如果在字段中放置映射注释,则属性的访问类型为AccessType.FIELD(例如,在zipCode中有@Embedded

    为了覆盖此默认行为,可以使用AccessType.PROPERTY显式标记属性,或者将@Embedded映射注释移动到getZipCode()方法