He creado una aplicación de uso de JPA en un contenedor EJB.
Aquí está mi código

@PersistenceContext(unitName = "damate-pu")
private EntityManager   em;

@Override
public Workspace find(String username, String path) {
    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Workspace> criteriaQuery = criteriaBuilder.createQuery(Workspace.class);
    Root<Workspace> from = criteriaQuery.from(Workspace.class);
    Predicate condition = criteriaBuilder.equal(from.get("Username"), username);
    Predicate condition2 = criteriaBuilder.equal(from.get("Path"), path);
    Predicate condition3 = criteriaBuilder.and(condition, condition2);
    criteriaQuery.where(condition3);
    Query query = em.createQuery(criteriaQuery);

    return (Workspace) query.getSingleResult();
}

Cuando intento ejecutar este método desde un webservice me sale el siguiente error:
java.lang.IllegalArgumentException: The attribute [Username] from the managed type....

Lo que puede ser el problema? Creo que tengo un problema con from.get("Username")
¿Qué te parece? Y cómo solucionarlo?


Editar: Workspace.java

package com.ubb.damate.model;
import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;
import java.util.Set;
/**
* The persistent class for the workspace database table.
* 
*/
@Entity
@Table(name="workspace")
public class Workspace implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="WorkspaceId", unique=true, nullable=false)
private int workspaceId;
@Temporal( TemporalType.DATE)
@Column(name="CreationDate", nullable=false)
private Date creationDate;
@Lob()
@Column(name="Path", nullable=false)
private String path;
@Column(name="Username", nullable=false, length=20)
private String username;
//bi-directional many-to-one association to Project
@OneToMany(mappedBy="workspace")
private Set<Project> projects;
public Workspace() {
}
public int getWorkspaceId() {
return this.workspaceId;
}
public void setWorkspaceId(int workspaceId) {
this.workspaceId = workspaceId;
}
public Date getCreationDate() {
return this.creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public String getPath() {
return this.path;
}
public void setPath(String path) {
this.path = path;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public Set<Project> getProjects() {
return this.projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
}

OriginalEl autor Infinite Possibilities | 2011-01-19

3 Comentarios

  1. 12

    Cuando la construcción de los criterios de consulta (o la construcción de jpql en una cadena), desea utilizar la propiedad de entidad nombres, no los nombres de columna. Su columna de base de datos se denomina «nombre de Usuario», pero la propiedad del área de trabajo objeto es «nombre de usuario» sin el capital U.

    OriginalEl autor digitaljoel

  2. 3

    Has intentado usar el metamodelo?

    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    Metamodel m = em.getMetamodel();
    EntityType<Workspace> WS = m.entity(Workspace.class);
    CriteriaQuery<Workspace> criteriaQuery = criteriaBuilder.createQuery(Workspace.class);
    Root<Workspace> from = criteriaQuery.from(Workspace.class);
    Predicate condition = criteriaBuilder.equal(from.get(WS.username), username);

    http://download.oracle.com/javaee/6/tutorial/doc/gjivm.html

    No puedo obtener el nombre de usuario por el LR. ¿Por qué es?
    lo siento, perdí correcta Metamodelo doc página de download.oracle.com/javaee/6/tutorial/doc/gjiup.html

    OriginalEl autor Osw

  3. 0
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<> criteriaQuery = criteriaBuilder
    .createQuery(Date.class);
    Root<test> root = criteriaQuery.from(test.class);
    criteriaQuery.select(criteriaBuilder.greatest(root
    .<Date> get("Starttime")));
    criteriaQuery.where(
    criteriaBuilder.equal(root.get("columnName 1"), filtervalue),
    criteriaBuilder.equal(root.get("columnName 2"), Filtervalue));
    TypedQuery<Date> query = entityManager.createQuery(criteriaQuery);
    Date date = query.getSingleResult();

    OriginalEl autor Anil Jain

Dejar respuesta

Please enter your comment!
Please enter your name here