-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: JPA 2 : Count with MapJoin and Predicate doesn't work
PostPosted: Sat Jul 13, 2013 9:42 am 
Newbie

Joined: Sat Jul 13, 2013 9:29 am
Posts: 1
I have a problem with a criteria count query with a MapJoin ! In fact it doesn't work !
I don't understand why ...

Here is my entities :
Code:
public class CmsItem {

@Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;


@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE,
        CascadeType.REMOVE }, fetch = FetchType.EAGER, mappedBy = "cmsItemLangPK.item")
@MapKey(name = "cmsItemLangPK.lang")
private Map<Lang, CmsItemLang> cmsItemLang;



public CmsItem() {
}


public Integer getId() {
    return this.id;
}

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


public Map<Lang, CmsItemLang> getCmsItemLang() {
    return cmsItemLang;
}

public void setCmsItemLang(Map<Lang, CmsItemLang> cmsItemLang) {
    this.cmsItemLang = cmsItemLang;
}
}


Code:
public class CmsItemLang implements Serializable {

private static final long serialVersionUID = 6832580916240288447L;

@EmbeddedId
private CmsItemLangPK cmsItemLangPK;

@Column(name = "title")
private String title;

@Column(name = "description")
private String description;

@Lob
@Column(name = "text")
private String text;

@Column(name = "linkRewrite")
private String linkRewrite;

@Column(name = "meta_title", length = 128)
private String metaTitle;

@Column(name = "meta_keywords", length = 255)
private String metaKeywords;

@Column(name = "meta_description", length = 255)
private String metaDescription;

public CmsItemLang() {
}

public CmsItemLangPK getCmsItemLangPK() {
    return cmsItemLangPK;
}

public void setCmsItemLangPK(CmsItemLangPK cmsItemLangPK) {
    this.cmsItemLangPK = cmsItemLangPK;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public String getLinkRewrite() {
    return linkRewrite;
}

public void setLinkRewrite(String linkRewrite) {
    this.linkRewrite = linkRewrite;
}

public String getMetaTitle() {
    return metaTitle;
}

public void setMetaTitle(String meta_title) {
    this.metaTitle = meta_title;
}

public String getMetaKeywords() {
    return metaKeywords;
}

public void setMetaKeywords(String meta_keywords) {
    this.metaKeywords = meta_keywords;
}

public String getMetaDescription() {
    return metaDescription;
}

public void setMetaDescription(String meta_description) {
    this.metaDescription = meta_description;
}
}


Here is my count method :
Code:
public long countItems(final String title, final String url) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<CmsItem> query = builder.createQuery(entityClass);
    Root<CmsItem> page = query.from(entityClass);
    MapJoin<Map<Lang, CmsItemLang>, Lang, CmsItemLang> mapJoin = page
            .joinMap("cmsItemLang");

    List<Predicate> predicateList = new ArrayList<Predicate>();
    Predicate titlePredicate, urlPredicate;
    if ((title != null) && (!(title.isEmpty()))) {
        titlePredicate = builder.like(
                builder.upper(mapJoin.value().<String> get("metaTitle")),
                "%" + title.toUpperCase() + "%");
        predicateList.add(titlePredicate);
    }
    if ((url != null) && (!(url.isEmpty()))) {
        urlPredicate = builder.like(
                builder.upper(mapJoin.value().<String> get("linkRewrite")),
                "%" + url.toUpperCase() + "%");
        predicateList.add(urlPredicate);
    }

    Predicate[] predicates = new Predicate[predicateList.size()];
    predicateList.toArray(predicates);

    CriteriaQuery<Long> cq = builder.createQuery(Long.class);
    cq.select(builder.count(cq.from(entityClass)));
    entityManager.createQuery(cq);
    cq.where(predicates);
    Long count = entityManager.createQuery(cq).getSingleResult();

    return count;
}


when I call the method I have for exemple this exception :
Code:
org.hibernate.QueryException: could not resolve property: linkRewrite of: com.demkocompany.models.CmsItem [select count(*) from com.demkocompany.models.CmsItem as generatedAlias0 where upper(generatedAlias0.linkRewrite) like :param0]


The translated query is totaly wrong !
Maybe I made something bad but on an others entity that doesn't have a Map field it works well so I don't understand.

Is there someone that can help me on this problem ?

Thanks a lot


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.