views:

65

answers:

2

My jboss seam application compile in eclipse without error. When I try to compile manually I have had a error

STATE_QUERY has private access

@NamedQueries({
    @NamedQuery(name = CurrentModuleState.FIND_MODULE_STATE,
         query = CurrentModuleState.STATE_QUERY)
})
public class CurrentModuleState implements java.io.Serializable {
        ...
        private static final String STATE_QUERY = "...";

ant:

<javac encoding="cp1251" srcdir="${src-dir}" destdir="${compile-dir}"
            executable="${javac-path}"
            compiler="javac1.6">
    <classpath refid="lib.classpath" />
    <classpath refid="jboss-lib.classpath" />
</javac>

How I can compile that? p.s. sorry for my engish )

A: 

It is an odd thing, But I would suppose it is because the field is private but is accessed using the class name in front. The compiler should realize it is referred from the same class, but it obviously doesn't.

So, change the private to protected (not elegant, but should work)

You can also try upgrading the JDK (and hence javac). Note that eclipse uses its own compiler (not javac)

Bozho
Or `query = CurrentModuleState.this.STATE_QUERY` maybe?
theseion
the shorter, the better
Bozho
It doesn't work.
dimafeng
@dimafeng _how_ it doesn't work? Is it the same compilation error? a different one?
Bozho
"STATE_QUERY cannot be resolved to a variable"
dimafeng
@dimafeng check my update
Bozho
@Bozho it works, but it is not elegant way
dimafeng
well, the other thing is - try to upgrade the JDK (and hence the compiler)
Bozho
if the problem in version of jdk then eclipse would not be able to compile that, but eclipse compile without errors.
dimafeng
not true - eclipse uses its own compiler, which differs from `javac`
Bozho
@Bozho Thank you
dimafeng
A: 

This doesn't exactly answer the question but I don't really see the point of using a constant for the query itself. I would just use something like this:

@Entity
@NamedQuery(name = Customer.FIND_ALL, query="select c from Customer c"),
public class Customer {
    public static final String FIND_ALL = "Customer.findAll";
    // Attributes, constructors, getters, setters
}

And the constant is public because... I want to be able to use it to execute queries:

Query query = em.createNamedQuery(Customer.FIND_ALL);
List<Customer> customers = query.getResultList();

Using a constant for the name of the query makes sense because you'll refer to it from several places (from the @NamedQuery annotation, when invoking the query) and a constant makes your code more robust: it will resist to typing mistakes and refactoring. The advantages are obvious.

However, I personally don't see any real advantage in using a constant for the query itself.

Pascal Thivent
Thanks. We decided to move all queries in public interface.
dimafeng