【问题标题】:JPA CriteriaQuery: fields of the object doesn't mappedJPA CriteriaQuery:对象的字段未映射
【发布时间】:2016-12-17 09:35:34
【问题描述】:

美好的一天。我尝试使用 CriteriaQuery 从表中选择行。

我有一个对象Card

@Entity(name = "bank_cards")
public class Card {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  @ManyToMany(mappedBy = "cards")
  private Set<Account> accounts;

  private String number;
  private float amount;
  private String expire;
  private String type;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getNumber() {
    return number;
  }

  public void setNumber(String number) {
    this.number = number;
  }

  public float getAmount() {
    return amount;
  }

  public void setAmount(float amount) {
    this.amount = amount;
  }

  public String getExpire() {
    return expire;
  }

  public void setExpire(String expire) {
    this.expire = expire;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public Set<Account> getAccounts() {
    return accounts;
  }

  public void setAccounts(Set<Account> accounts) {
    this.accounts = accounts;
  }
}

使用 CriteriaQuery 选择行:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("cards");
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();

CriteriaQuery<Card> cq = cb.createQuery(Card.class);
Metamodel m = em.getMetamodel();
EntityType<Card> Card_ = m.entity(Card.class);

Root<Card> card = cq.from(Card.class);
cq.where(card.get(Card_.number)); // error

在最后一个字符串字段number 未找到。

persistence.xml 中的链接单元:

<persistence-unit name="users" transaction-type="RESOURCE_LOCAL">
    <class>main.java.entities.User</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/java" />
      <property name="javax.persistence.jdbc.user" value="java" />
      <property name="javax.persistence.jdbc.password" value="java" />

      <!-- EclipseLink should create the database schema automatically -->
      <property name="eclipselink.ddl-generation" value="create-tables" />
      <property name="eclipselink.ddl-generation.output-mode" value="database" />
    </properties>
  </persistence-unit>

我需要执行下一个查询:

"SELECT * FROM bank_cards WHERE number='" + cardNumber + "'"

cardNumber - 字符串

元模型类:

@StaticMetamodel(Card.class)
public class Card_ {
  public static volatile SingularAttribute<Card, Integer> id;
  public static volatile SingularAttribute<Card, String> number;
  public static volatile SingularAttribute<Card, String> expire;
  public static volatile SingularAttribute<Card, String> type;

  public static volatile SingularAttribute<Card, Float> amount;

  public static volatile SetAttribute<Card, Account> accounts;
}

【问题讨论】:

  • 向我们展示您的元模型 Card_ 类。
  • @PaulWasilewski 我已经在上面添加了
  • 错误堆栈跟踪?
  • @jklee 没有堆栈跟踪,此代码无法编译,尝试获取 Card 的任何字段时出错,鼠标悬停时找不到字段消息

标签: java jpa


【解决方案1】:

你的谓词是错误的。

public Card byNumber(String number) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Card> cq = cb.createQuery(Card.class);

    Root<Card> card = cq.from(Card.class);
    Predicate equalPredicate = cb.equal(card.get(Card_.number), number);
    cq.where(equalPredicate);
    cq.select(card);
    return em.createQuery(cq).getSingleResult();
}

【讨论】:

  • 但这不是一个条件查询 :D 所以,还是谢谢你 :)
  • 这是 100% 的标准查询。为什么不呢?
  • 哦,真的。不知道,为什么我决定不这样做。对不起。刚刚看到createQuery 也存在EntityManager...对不起。再次感谢您!
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多