开发者

JPA query language criteriaBuilder

I have built an application using JPA in an EJB container. Here's my code

@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"), pat开发者_开发技巧h);
    Predicate condition3 = criteriaBuilder.and(condition, condition2);
    criteriaQuery.where(condition3);
    Query query = em.createQuery(criteriaQuery);

    return (Workspace) query.getSingleResult();
}

When I try to run this method from a webservice I get the following error: java.lang.IllegalArgumentException: The attribute [Username] from the managed type....

What can be the problem? I think I have a problem with from.get("Username")...

What do you think? And how to fix it?


Edit: 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;
    }
}


When building your criteria query (or building jpql in a string), you want to use the entity property names, not the column names. Your database column is named "Username", but the property of the Workspace object is "username" without the capital U.


Have you tried using metamodel?

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


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();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜