如何在使用criteriupdate Query时避免硬编码attributeName



我有一个实体:

@Entity
@Table
public class ClassA{
    public static final String COL_VERSION = "VersionABC";
    public static final String COL_DATA = "DataABC";
    @Column(name = COL_VERSION)
    private String version;
    @Column(name = COL_DATA)
    private String data;
}   

在我的DAO中:

EntityManager mgr = getEntityManager();
CriteriaBuilder builder = mgr.getCriteriaBuilder();
CriteriaUpdate<ClassA> criteriaUpdate = builder.createCriteriaUpdate(ClassA.class);
Root<ClassA> root = criteriaUpdate.from(ClassA.class);
criteriaUpdate.set(root.get("data"), newData);
if (//condition){
    criteriaUpdate.set(root.get("version"), newVersion);    
}
mgr.createQuery(criteriaUpdate).executeUpdate();

这个代码可以工作,但是如何使用ClassA.COL_VERSIONClassA.COL_DATA而不是使用硬代码"data"one_answers"version"呢?

try like this it should be _. instead of ._

EntityManager mgr = getEntityManager();
CriteriaBuilder builder = mgr.getCriteriaBuilder();
CriteriaUpdate<ClassA> criteriaUpdate = builder.createCriteriaUpdate(ClassA.class);
Root<ClassA> root = criteriaUpdate.from(ClassA.class);
criteriaUpdate.set(root.get(ClassA_.data), newData);
if (//condition){
    criteriaUpdate.set(root.get(ClassA_.version), newVersion);    
}
mgr.createQuery(criteriaUpdate).executeUpdate();

引用http://www.programcreek.com/java-api-examples/index.php?api=javax.persistence.criteria.CriteriaUpdate

您可以使用可以自动生成的元模型类。如果你使用maven来控制依赖,那么添加这个插件,它将为你生成元模型类。

<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <version>2.2.4</version>
    <executions>
     <execution>
       <id>process</id>
       <goals>
         <goal>process</goal>
       </goals>
       <phase>generate-sources</phase>
       <configuration>
         <processors>
           <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
         </processors>
       </configuration>
     </execution>
    </executions>
    <dependencies>
     <dependency>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-jpamodelgen</artifactId>
       <version>5.2.2.Final</version>
     </dependency>
    </dependencies>
</plugin>

一旦生成元模型类,您就可以使用属性名,如…

root.get(ClassA_.data)代替root.get("data")

最新更新