java - 为什么编译器不识别元模型属性?

标签 java eclipselink jpa-2.0 criteria-api

java se 6项目是否支持eclipselink jpa2的criteria api?如果没有,那是我的问题。 我是否需要在 persistence.xml 中为条件 api 指定任何特殊内容?

这是我的条件查询:

 final EntityType<Meaning> Meaning_ = em.getMetamodel().entity(Meaning.class);
    final CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Integer> cq = cb.createQuery(Integer.class);
    final Root<Meaning> meng = cq.from(Meaning.class);
    cq.where(meng.get(Meaning_.lastPublishedDate)); //this attributes are not recognized/found
    cq.select(meng.get(Meaning_.objId));            // "                "                   
    TypedQuery<Integer> q = em.createQuery(cq); 
    return q.getResultList();

这是我的意义实体:

@Entity
public class Meaning implements Serializable{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int objId;

public int getObjId() {
    return objId;
}

@Temporal(javax.persistence.TemporalType.DATE)
private Date lastPublishedDate = null;//never

public Date getLastPublishedDate(){
        return lastPublishedDate;
    }
}

最佳答案

关于您的代码

我没有检查条件查询本身的正确性,但正如 Chris 提到的,您将静态元模型类与 EntityType 混合在一起那不会暴露您要查找的内容。假设您的元模型类已生成,删除第一行并导入生成的 Meaning_ :

// final EntityType<Meaning> Meaning_ = em.getMetamodel().entity(Meaning.class); 
final CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Integer> cq = cb.createQuery(Integer.class);
final Root<Meaning> meng = cq.from(Meaning.class);
cq.where(meng.get(Meaning_.lastPublishedDate)); // add the appropriate import 
cq.select(meng.get(Meaning_.objId));            
TypedQuery<Integer> q = em.createQuery(cq); 
return q.getResultList();

关于静态(规范)元模型类的生成

这是我用来通过 EclipseLink 生成规范元模型类的 Maven 设置:

<project>
  ...
  <repositories>
    <!-- Repository for EclipseLink artifacts -->
    <repository>
      <id>EclipseLink Repo</id>
      <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo/</url>
    </repository>    
    ...
  </repositories>
  ...
  <pluginRepositories>
    <!-- For the annotation processor plugin -->
    <pluginRepository>
      <id>maven-annotation-plugin</id>
      <url>http://maven-annotation-plugin.googlecode.com/svn/trunk/mavenrepo</url>
    </pluginRepository>
  </pluginRepositories>
  ...
  <dependencies>
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>eclipselink</artifactId>
      <version>2.1.0</version>
    </dependency>
    <!-- optional - only needed if you are using JPA outside of a Java EE container-->
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>javax.persistence</artifactId>
      <version>2.0.2</version>
    </dependency>
  <dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <version>1.3.1</version>
        <executions>
          <execution>
            <id>process</id>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <!-- Without this, the annotation processor complains about persistence.xml not being present and fail -->
              <compilerArguments>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArguments>
              <!-- For an unknown reason, the annotation processor is not discovered, have to list it explicitly -->
              <processors>
                <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor>
              </processors>
              <!-- source output directory -->
              <outputDirectory>${project.build.directory}/generated-sources/meta-model</outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <inherited>true</inherited>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <compilerArgument>-proc:none</compilerArgument>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
</project>

一些评论:

  • EclipseLink 注释处理器由主要工件提供,无需添加额外的依赖项。
  • 由于未知原因,未发现注释处理器,我必须将其明确列为 <processor> .
  • 没有 -Aeclipselink.persistencexml ,注释处理器提示 persistence.xml不在场和失败。
  • 我更喜欢在 target 下生成源代码(我想要一个 clean 来清理它)。

有了这个配置,静态元模型类就可以正确地生成和编译了。

关于java - 为什么编译器不识别元模型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3458742/

相关文章:

java - com.sun.xml.internal.ws.fault.SOAPFaultBuilder 的 NoClassDefFoundError

java - 如何使用名称访问 Java 中的变量?

java - 只有当查询包含 FIRST_ROWS 或 ROWNUM 限制时,ResultSet.next 才会非常慢

java - JPA Eclipselink 数据库更改通知不会使缓存条目无效

hibernate - JBoss 5.1 : Hibernate with JPA

java - ReplaceAll() 与 ReplaceAll(..., Matcher.quoteReplacement)

java - 图像像素替换

java - 带有鉴别器列的对象的 Eclipselink 延迟加载问题

unit-testing - Playframework 2.2.x + Java +JPA - 用于单元测试和生产的单独数据库

java - 带有对象引用的 JPA 复合键